これら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など)の処理中にip
2番目のフィールドがすでに存在する場合は、配列から要素を削除します。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