NR=FNR을 사용하여 두 파일의 차이점만 인쇄하는 방법은 무엇입니까?

NR=FNR을 사용하여 두 파일의 차이점만 인쇄하는 방법은 무엇입니까?

File-1과 File-2의 이전 항목 Delta(Difference)만 인쇄해야 합니다. files-1에 새로 추가된 엔터티는 인쇄할 필요가 없습니다.

내 Unix 서버에서는 매일 시스템에서 새 보고서를 가져와서 어제의 보고서와 비교합니다.

오늘의 보고서에 새로 추가된 행은 완벽하게 작동하는 별도의 논리로 인쇄됩니다.

이제 내 요구 사항은 어제 보고서와 비교한 후 오늘 보고서($2의 경우 수정된 $4 확인)에서 업데이트된 필드를 식별하는 것입니다. 따라서 논리는 $2를 한 줄씩 검사하여 File1에서 $4의 업데이트된 필드를 찾아 인쇄해야 합니다.

이 작업을 수행하려면 NR=FNR 논리가 있지만 다음 경우에는 작동하지 않습니다.

/usr/xpg4/bin/awk -F'!' 'NR==FNR{++a[$2,$4];next} !a[$2,$4]++ || NR==FNR{++a[$4];hold} a[$4]++' file-1 file-2

그러나 이 새로운 논리는 다음 필드 조합에 대해 이미 실패합니다.

파일-새로 만들기

7! J9AA-50! LHR! 35!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! test3! test3! 8!
7! JWZZ-50! LHN! 15!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 21!

오래된 파일

7! J9AA-50! LHR! 34!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! test3! test3! 8!
7! JWZZ-50! LHN! 14!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 21!

새로운 비교 및 ​​인쇄 명령을 사용하십시오. 다음 논리는 예상 결과를 인쇄하지 못합니다.

/usr/xpg4/bin/awk -F'!' 'NR==FNR{++a[$2,$4];next} !a[$2,$4]++ || NR==FNR{++a[$4];hold} a[$4]++' File-New File-Old

이 명령은 불필요하게 다음 줄을 인쇄합니다.

8! J9BB-50! LHW! 22! 
7! test3! test3! 8!
7! J9AA-50! LHR! 34!

현재 결과,

7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! JWZZ-50! LHN! 14! 
7! J9AA-50! LHR! 34!

예상되는 결과:

7! J9AA-50! LHR! 34!
7! JWZZ-50! LHN! 14!

현재 결과에는 2, 3, 5행이 없습니다.

오늘의 새 보고서에서 업데이트된 업데이트된 파일의 이전 필드($2 수정된 $4 확인)를 인쇄해야 합니다. 따라서 논리는 File-Old에서 File-new까지 $2를 검색하고 File-New에 $2가 있으면 해당 $4 값을 비교하고 $4가 최신이면 File-Old에서 해당 행을 인쇄해야 합니다.

누구든지 예상되는 결과를 얻기 위해 변경 사항/새 논리를 제안할 수 있습니까? NR=FNR을 사용하는 것이 불가능하다면 쉘/펄 스크립트를 사용하여 어떻게 얻을 수 있습니까?

답변1

diff file_old file_new |grep '< ' |awk -F'<' '{print $2}'

7! J9AA-50! LHR! 34!
7! JWZZ-50! LHN! 14!

답변2

File-2를 읽은 다음 File-1에서 배열에 없는 행을 찾습니다. awk는 SUBSEP변수를 사용하여 배열 인덱스의 문자열을 연결한다는 점을 기억하세요.

awk -F'!' 'NR == FNR {f2[$2,$4]; next}  !($2 SUBSEP $4 in f2)' File-2 File-1

생산하다

7! J9AA-50! LHR! 35! 
7! test3! test3! 8 
7! test3! test3! 8 
7! JWZZ-50! LHN! 15! 

답변3

다른 하나는 필드를 awk행별로 $2비교 합니다.$4

awk 'NR==FNR{f[NR]=$2$4; next}f[FNR]!=$2$4{print }' file1 file2

산출

7! J9AA-50! LHR! 34!
7! JWZZ-50! LHN! 14!

관련 정보