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

答え2

以下を実行してください。

awk -F, 'NR==FNR{arr[$2]=$0;next} !($2 in arr)' source event #>> source

カンマ区切りのフィールドを持つ2番目の列に基づいてdiff行を追加するには、>> source上記のコマンドでコメントを外します。

いいえ、IP:port部分を基準に比較したい場合です。これにより、次のように使用できます。

awk -F, 'NR==FNR{arr[$2FS$3]=$0;next} !($2FS$3 in arr)' source event #>> source

答え3

あなたの条件に従って:

  • 「source.txt」に追加してください。

  • ただ追加したい新しいログファイル「events.txt」に「source.txt」と表示されたIP


これはGNUの組み合わせに基づく完璧なソリューションです。sed切るそしてgrep:

sed -i "\$ a $(cut -d, -f2 source.txt | grep -vf - events.txt)" source.txt

生成されたsource.txtファイルの内容:

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

関連情報