2つのファイル間の特定の列の違いに基づいてfile1に追加

2つのファイル間の特定の列の違いに基づいてfile1に追加

これら2つのファイルを比較し、次の行だけを印刷して "source.txt"に追加したいと思います。

01.02.70 08h00,4.4.4.4,443

これは私のファイルです:

ソースファイル.txt

DATETIME,IPSOURCE,PORT
01.01.70 08h00,0.0.0.0,443
01.01.70 08h00,2.2.2.2,443

イベント.txt

DATETIME,IPSOURCE,PORT
01.02.70 09h00,0.0.0.0,443
01.02.70 09h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443

比較では、DATETIMEフィールドは気にせず、ログファイル「events.txt」に表示される新しいIPを「source.txt」に追加したいと思います(アドレス0.0.0.0と2.2.2.2は両方に表示されます)。ファイル)。

だから私は使いたい

grep -vxFf source.txt events.txt

最初のフィールドは考慮せず、IPSOURCEフィールド(2番目の列)でのみ違いを見つけます。

ベストアンサー1

awkフィールドベースの比較が必要な場合に使用

$ awk -F, 'NR==FNR{ip[$2]=$0; next} $2 in ip{delete ip[$2]} END{for(k in ip) print ip[k]}' events.txt source.txt
01.02.70 08h00,4.4.4.4,443
  • -F,,入力フィールド区切り文字として設定
  • NR==FNR{ip[$2]=$0; next}2番目のフィールドをキーとして使用し、行全体を連想配列に格納します。このコードブロックは、最初のファイル入力(例:events.txt)に対してのみ実行されます。
  • $2 in ip{delete ip[$2]}2番目のファイル(source.txtなど)の処理中にip2番目のフィールドがすでに存在する場合は、配列から要素を削除します。
  • END{for(k in ip) print ip[k]}すべての入力が処理された後、ip配列の残りの行を印刷します。


または、source.txt に 2 番目のフィールドがない場合は、入力ファイルの順序を変更し、events.txt の行を印刷します。

$ awk -F, 'NR==FNR{ip[$2]; next} !($2 in ip)' source.txt events.txt
01.02.70 08h00,4.4.4.4,443

おすすめ記事