awk를 사용하여 두 파일 처리


9

Unix와 Awk를 사용하여 두 파일 비교를 읽었습니다 . 정말 흥미 롭습니다. 나는 그것을 읽고 테스트했지만 그것을 완전히 이해하고 다른 경우에는 사용할 수 없습니다.

두 개의 파일이 있습니다. file1한 필드가 있고 다른 필드에는 16 개의 필드가 있습니다. file1의 요소를 읽고의 3 번째 필드와 비교하고 싶습니다 file2. 각 요소에 일치하는 항목이 있으면 필드 5의 값을에 합산합니다 file2. 예로서:

파일 1

1
2
3

파일 2

2 2 2 1 2
3 6 1 2 4 
4 1 1 2 3
6 3 3 3 4 

요소 1 file1file2경우 필드 3의 값이 1 인 필드 5에 값을 추가하고 싶습니다 file1. 1의 출력은 (3 + 4 = 7)이고 2의 출력은 2이고 3의 출력은 4입니다.

나는 awk로 어떻게 써야하는지 모른다.

답변:


20

한 가지 방법이 있습니다. 주석을 추가 할 수 있도록 awk 스크립트로 작성했습니다.

#!/usr/local/bin/awk -f

{
    ## FNR is the line number of the current file, NR is the number of 
    ## lines that have been processed. If you only give one file to
    ## awk, FNR will always equal NR. If you give more than one file,
    ## FNR will go back to 1 when the next file is reached but NR
    ## will continue incrementing. Therefore, NR == FNR only while
    ## the first file is being processed.
    if(NR == FNR){
      ## If this is the first file, save the values of $1
      ## in the array n.
      n[$1] = 0
    }
    ## If we have moved on to the 2nd file
    else{
      ## If the 3rd field of the second file exists in
      ## the first file.
      if($3 in n){
        ## Add the value of the 5th field to the corresponding value
        ## of the n array.
        n[$3]+=$5
      }
    }
}
## The END{} block is executed after all files have been processed.
## This is useful since you may have more than one line whose 3rd
## field was specified in the first file so you don't want to print
## as you process the files.
END{
    ## For each element in the n array
    for (i in n){
    ## print the element itself and then its value
    print i,":",n[i];
    }
}

파일로 저장하고 실행 파일로 만들고 다음과 같이 실행할 수 있습니다.

$ chmod a+x foo.awk
$ ./foo.awk file1 file2
1 : 7
2 : 2
3 : 4

또는 하나의 라이너로 응축시킬 수 있습니다.

awk '
     (NR == FNR){n[$1] = 0; next}
     {if($3 in n){n[$3]+=$5}}
     END{for (i in n){print i,":",n[i]} }' file1 file2

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.