파일 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
두 파일에 모두 존재함) .$3
equator
globe
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)