두 파일의 열 1-5를 일치시키고 일치하는 열 1-5뿐만 아니라 파일 1의 열 6과 7, 파일 2의 열 6을 인쇄합니다.

두 파일의 열 1-5를 일치시키고 일치하는 열 1-5뿐만 아니라 파일 1의 열 6과 7, 파일 2의 열 6을 인쇄합니다.

2개 파일의 1~5열을 일치시키고 1~5열, 파일 1의 6열과 7열, 파일 2의 6열을 인쇄하려고 합니다. 두 파일 모두에서 일치하지 않는 행은 일치하지 않는 열에도 NA 값을 인쇄해야 합니다.

file1

12  800000  900000  66  73  0   0  
12  900000  1000000 73  48  2   2  
13  1000000 1100000 11  11  0   0  
12  1100000 1200000 12  12  0   0  
18  1400000 1600000 33  33  3   3  

file2

12  800000  900000  66  73  145(28.12)  
12  900000  1000000 73  48  703(51.17)  
13  1000000 1100000 11  11  545(43.99)  
12  1100000 1200000 12  12  699(45.30)
14  16100000    16200000    0   0   11(14.50)  
14  16200000    16300000    0   0   0    

Expected output

12  800000  900000  66  73  145(28.12)  0  0   
12  900000  1000000 73  48  703(51.17)  2  2  
13  1000000 1100000 11  11  545(43.99)  0  0  
12  1100000 1200000 12  12  699(45.30)  0  0  
14  16100000  16200000  0  0  11(14.50)  NA  NA 
14  16200000  16300000  0  0  0  NA  NA  
18  1400000 1600000 33  33  NA  3   3

아래 awk 명령을 시도했지만 두 파일 모두에서 열을 가져오지 못했습니다.

awk 'FNR==NR{A[$1 FS $2 FS $3 FS $4 FS $5]=$3;next}{print ($1 FS $3 FS $4 FS $5 in A ) ? $0 OFS A[$1 FS $3 FS $4 FS $5] : $0 OFS "NA"}' file1 file2

답변1

코드가 설명과 일치하지 않습니다. 예를 들어 나중에 인쇄하기 위해 $3를 file1에 저장하지만 $4와 $6을 인쇄하려고 하면 예상되는 출력이 그 중 어느 것과도 일치하지 않고 대신 $6의 file1을 표시합니다. 그리고 7달러. 따라서 예상되는 결과를 바탕으로 이것이 원하는 것이라고 생각합니다.

$ cat tst.awk
{ key = $1 OFS $2 OFS $3 OFS $4 OFS $5 }
FNR==NR {
    file1[key] = $6 OFS $7
    next
}
{
    print $0, (key in file1 ? file1[key] : "NA" OFS "NA")
    delete file1[key]
}
END {
    for ( key in file1 ) {
        print key, "NA", file1[key]
    }
}

$ awk -f tst.awk file1 file2
12  800000  900000  66  73  145(28.12) 0 0
12  900000  1000000 73  48  703(51.17) 2 2
13  1000000 1100000 11  11  545(43.99) 0 0
12  1100000 1200000 12  12  699(45.30) 0 0
14  16100000    16200000    0   0   11(14.50) NA NA
14  16200000    16300000    0   0   0 NA NA
18 1400000 1600000 33 33 NA 3 3

두 파일의 키 인덱스를 유지하기 위해 변수를 사용하는 것에 유의하세요. 값 으로 구성된 키 가 있는 경우 실수하기 쉽기 때문에 코드에 여러 번 작성하려고 하지 마십시오 $2. )에서 다시 한 번 말씀드리겠습니다 .$1 FS $3 FS $4 FS $5 in A$1 FS $2 FS $3 FS $4 FS $5 in AA[$1 FS $3 FS $4 FS $5]

또한 - 내장 변수 이름과의 충돌을 피하기 위해 변수 이름을 모두 대문자로 사용하지 마십시오(예: A). 코드를 더 명확하게 만들기 위해 괄호를 사용하십시오(다른 것이 없다면). 예: idk if $1 FS $2 in A수단(예: 조회 결과와의 연결 ($1 FS) ($2 in A)) 또는 ( 즉, 연결 결과) 또는 다른 것을 찾으십시오. 그러나 단순히 작성하면 명확하고 모호하지 않습니다.$1 FS$2 in A($1 FS $2) in A$1 FS $2A($1 FS $2) in A

OFS마지막으로 배열 인덱스 구분 기호로 not 을 사용하고 있다는 점에 유의하세요 FS. 이는 코드에서 END해당 섹션의 값을 인쇄하고 출력 필드를 구분해야 하는 항목이 가 OFS아니기 때문입니다 FS. 이 경우 둘 다 공백 문자이므로 차이점을 볼 수 없지만 CSV를 출력하려면 내 코드를 사용하여 추가 -v OFS=','하면 그대로 작동합니다. 배열 인덱스 첨자 사이에 사용하고 있다면 FS이를 변경해야 합니다.

관련 정보