awkとshellscriptを使用してログファイルを操作するのに問題があります。

awkとshellscriptを使用してログファイルを操作するのに問題があります。

awkに問題があります。最初のフィールドと3番目のフィールドが2つの異なるファイルで一致する場合は、列を連結したいと思います。おそらく、配列関数を使用する方が良いと思いますが、これは混乱しています。

入力例

file1
0x11110293030,2019-10-13T12:13:39,8.8.8.8,KeitheNoop,workgroupa
0x22222211111,2019-10-12T12:17:23,8.8.8.8,KattheNoop,workgroups
0x21034922113,2019-10-14T15:12:63,8.8.8.8,KoitheNoop,workgroupz

file2
0x11110293030,2019-10-13T12:22:44,8.8.8.8,KeiLeftAll,workgroupk
0x22222211111,2019-10-14T12:19:23,8.8.8.8,KattheNoop,workgroups
0x21034922113,2019-10-14T15:34:63,8.8.8.8,KoitheNoop,workgroupz

期待される出力

0x11110293030,8.8.8.8,KeitheNoop,workgroupa,2019-10-13T12:13:39 ~ 2019-10-13T12:22:44,8.8.8.8,KeiLeftAll,workgroupk
0x22222211111,8.8.8.8,KattheNoop,workgroups,2019-10-12T12:17:23 ~ 2019-10-14T12:19:23,8.8.8.8,KattheNoop,workgroups
0x21034922113,8.8.8.8,KoitheNoop,workgroupz,2019-10-14T15:12:63 ~ 2019-10-14T15:34:63,8.8.8.8,KoitheNoop,workgroupz

可能であれば、これらのコードがどのように機能するかを簡単に説明してください。ご協力ありがとうございます。

ベストアンサー1

awk -F',' '{
  if (FNR==NR){
    a[$1"@"$3]=$4","$5","$2
  }
  else if ($1"@"$3 in a){
    print $1","$3","a[$1"@"$3]" ~ "$2","$3","$4","$5
  }
}' file1 file2

最初のファイルが処理されると(FNR==NR現在のファイルの入力レコード数がレコード全体の数に等しい、つまり最初のファイルが処理されていることを意味します)、4番目、5番目、2番目のフィールドを含む文字列が最初と3番目フィールドと結合されますa。フィールドはマージされ、配列に@インデックスとして格納されます。

2番目のファイル(else if)を処理し、現在行の最初と3番目のフィールドのキーの組み合わせが配列にある場合は、最初と3番目のフィールド、保存された配列値、チルダ、およびフィールド2〜5を印刷します。

あなたの質問は「宿題」のように見えます。配列の仕組みを理解したい場合は、awk自分で試してみることをお勧めします。

おすすめ記事