2017-04-13 11 views
0

다른 awk 질문으로 다시 나타납니다.awk를 사용하여 여러 파일에서 동일한 열 값의 모든 인스턴스 제거

서로 중복 제거하려는 데이터가 포함 된 여러 개의 큰 파일이 있습니다. 나는이 데이터를 수신

fruit number rand 
apple 12 342 
taco 19 264 
tortilla 2234 53423 
tortillas 2 3431 
apricot 13221 23424 
apricots 24234 3252 
pineapple 2342 2342 
radish 1 3 

다음 달 : 내가 한 달 동안 다음과 같은 데이터가 있다고 가정하자

fruit number rand 
pineapple 2 698 
apple 34 472 
taco 19 234 
tortilla 16 58 
tortillas 87 25 
potato 234 2342 
radish 1 55 
grapes 9 572 422 
apricot 13221 24 

내가 두 번째 파일을, 그리고 값을 확인하면된다하려고 첫 번째 파일의 항목이 있는지 확인하십시오. 그렇다면 두 번째 파일에서 해당 파일을 제거하여 첫 번째 파일과 관련하여 두 번째 파일에 고유 한 항목 만 남기고 싶습니다.

원하는 결과는 다음과 같이 나에게 뭔가를 떠날 것이다 : 또는, 더 명확하게

fruit number rand DUPLICATE 
pineapple 2 698  DUPE 
apple 34 472   DUPE 
taco 19 234   DUPE 
tortilla 16 58  DUPE 
tortillas 87 25  DUPE 
potato 234 2342 
radish 1 55   DUPE 
grapes 9 572 422 
apricot 13221 24  DUPE 

을 :

fruit number rand 
potato 234 2342 
grapes 9 572 422 

나는 파일을 정렬 할 필요없이이 작업을 수행 할 수있는 방법을 생각하려고했다 . related question에 대한 @karafka의 답을 수정하려고했습니다. 동일한 파일을 두 번 전달하는 대신 두 개의 다른 파일을 입력하려고했습니다. 분명히 내가 뭔가 잘못하고있다. 난 여전히 AWK를 배우고

awk 'BEGIN { FS = OFS = "  " } 
    NR==FNR {a[$1]++; next} 
    FNR==1 {print $0, "DUPLICATE"; next} 
    $1 in a{if (a[$1]>1){print $(NF+1)="DUPE";delete a[$1]}}1' file{,} 

는 모든 지역 사회가 대단히 감사합니다 제공 할 수 있도록,하지만 난 위의 프로그램이하는 무슨 생각을 설명하려고합니다.

  1. 첫 번째 줄은 구분 기호와 출력 구분 기호를 탭 문자로 설정합니다.
  2. 이 줄은 첫 번째 파일을 읽고 항목이 목록에 나타나는 횟수를 나타내는 배열을 저장합니다.
  3. 기본적으로 행의 마지막 항목 끝에 "DUPLICATE"를 추가하여 머리글 인 첫 번째 줄을 출력합니다.
  4. (여기가 멈췄습니다) 현재 값이 배열에서 발견되면 " a "저장된 값이 1보다 큰지 확인해야합니다. 그렇다면 마지막 열에 "DUPE"라는 단어가 인쇄됩니다. 마지막으로 전체 행을 반환합니다.

테스트 파일에서 나는 모든 것을 "DUPE"로 표시하거나 아무것도 표시하지 않습니다.

나는 또한 파일들을 결합하고 그런 식으로 쓸데없는 생각을 해왔지만, 그것은 첫 번째 파일로부터의 바람직하지 않은 남은 값들을 남겨 둡니다.

내가 뭘 잘못하고 있니?

+0

내 실사를하는 많은 연구, 나는이 조각을 발견했다. 'awk -F, ' !본 [$ 2] ++ { 라인 [$ 2] = $ 0 } END {(본에 발) 위한 경우 (본 [발] == 1) 인쇄 라인 [발] } A로부터 'file' [비슷한 질문] (http://stackoverflow.com/questions/22308082/remove-all-lines-from-file-with-duplicate-value-in-field-including-the-first-oc?rq=1). 이것이 내 목표에 더 가까워지면 업데이트 할 것입니다. – mikelcal

답변

2

내가 뭘 잘못 생각하는 것은 시작점과 관련없는 현재 문제와 관련없는 많은 스크립트를 사용하려고하는 것입니다. 당신이 필요로하는 모든이 같은

그것은 소리 :

$ awk ' 
NR==FNR { file1[$1]; next } 
FNR==1 || !($1 in file1) 
' file1 file2 
fruit number rand 
potato 234 2342 
grapes 9 572 422 
+1

감사합니다. Ed Morton! 이것은 내가하고 싶은 일을 정확하게 수행합니다. 당신은 정확합니다, 나는 손으로 데이터를 입력하고 있었고 '무'은 산출물의 일부가되어서는 안됩니다. 어떻게 작동하는지 이해해 주시겠습니까? – mikelcal

+0

사용하고있는 스크립트보다 훨씬 간단합니다 - 어떻게 작동한다고 생각합니까? 나는 질문에 대답하게되어 기쁠거야. –

+1

나는 그것을 줄 것이다. – mikelcal