awk에서 구분 기호를 사용하여 파일을 한 줄씩 비교합니다.

awk에서 구분 기호를 사용하여 파일을 한 줄씩 비교합니다.

파일 1:

abc|123|check
def|456|map
ijk|789|globe
lmn|101112|equator

파일 2:

abc|123|check
def|456|map
ijk|789|equator
lmn|101112|globe

예상 출력:

ijk|789|equator
lmn|101112|globe

현재 awk 스크립트:

awk 'BEGIN{OFS=FS="|"} NR==FNR{a[$3]=$3;next}!($3 in a)' file1 file2

이는 배열 내용을 기준으로 비교됩니다. 행별로 비교하여 결과만 인쇄하는 방법입니다.

답변1

내가 올바르게 이해했다면 세 번째 필드가 file1의 해당 항목과 다른 경우 file2에서 한 줄을 인쇄하고 싶습니다. 그렇다면 다음을 수행해야 합니다.

awk 'BEGIN{FS="|"} NR==FNR{a[$1,$2]=$3;next}(a[$1,$2]!=$3)' file1  file2

$3귀하의 키는 배열의 키로 만들고 고유하지 않기 때문에 작동하지 않습니다(둘 다 a두 파일에 모두 존재함) .$3equatorglobe

grep나는 이 특정한 경우에 대해 와 둘 다 더 간단하다는 @drewbenn의 의견에 동의합니다. join그러나 동일한 작업을 수행하는 Perl 방법은 다음과 같습니다.

perl -laF'\|' -ne '($k{$F[0].",".$F[1]}||=$F[2]) eq $F[2]||print;' file1  file2

답변2

사용하고 싶으신 것 같아요join(또는 grep -f) 대신. 하지만 만약 당신이~ 해야 하다awk를 사용하세요:

echo | awk '{system("join -v 2 file1 file2")}'

이것은 단지 awk 프론트엔드입니다 join -v 2 file1 file2. 물론 grep -v -f file1 file2.

답변3

comm작업을 위한 실제 도구는 다음과 같습니다.

comm -13 file1 file2
ijk|789|equator
lmn|101112|globe

입력 파일이 아직 정렬되지 않은 경우:

comm -13 <(sort file1) <(sort file2)

관련 정보