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!