NR = FNRを使用して2つのファイルの違いのみを印刷する方法は?

NR = FNRを使用して2つのファイルの違いのみを印刷する方法は?

File-1 と File-2 の前の項目 Delta(Difference) のみを印刷する必要があります。 files-1に新しく追加されたエンティティは印刷する必要はありません。

私のUnixサーバーでは、毎日システムから新しいレポートを取得し、昨日のレポートと比較します。

今日のレポートに新しく追加された行は、完全に機能する別々のロジックで印刷されます。

今私の要件は、昨日のレポートと比較して、今日のレポート($ 2の場合は変更された$ 4の確認)で更新されたフィールドを識別することです。したがって、ロジックは$ 2を1行ずつ調べて、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!

おすすめ記事