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!

答え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

もう 1 つはフィールドを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!

関連情報