awkは3番目と4番目のパターンを一致させ、1行に印刷します。

awkは3番目と4番目のパターンを一致させ、1行に印刷します。

最初、私はこれに対する解決策を得ました。郵便はがき

ただし、これは2つのモードでのみ利用可能です。これで、2つ以上のパターン、たぶん3番目のパターン、さらには4番目のパターンが必要であることがわかりました。

@casで得られたパターンを追加して、次の解決策を試しました。

awk -v OFS=, '
match($0,/\<[[:digit:]]{1,2}\/[[:digit:]]{1,2}\/[[:digit:]]{4} [[:digit:]]{1,2}:[[:digit:]]{1,2}\>/,a) {dt = a[0]; next};
match($0,/3rd pattern/,b);
match($0,/INC-[[:digit:]]+-[[:digit:]]+/,a) {print a[0], dt; print b[0]}' filename.log

私は次のような結果を得ました。

INC-210305-00000426,3/6/2021 5:19

INC-20210304-00006690,3/5/2021 5:24

スペースを追加するだけです。 3番目または4番目のパターンを見つける方法に関する他の提案はありますか?彼らは実際に別のルートにあります。入力は次のとおりです。

unwantedtext unwantedtext unwantedtext unwantedtext 8/1/2022 6:15 (1st Pattern)

unwantedtext unwantedtext unwantedtext unwantedtext 
unwantedtext unwantedtext Report_A (3rd Pattern)
unwantedtext unwantedtext INC-220721-00007628 (2nd required pattern)
unwantedtext unwantedtext unwantedtext unwantedtext 
unwantedtext unwantedtext Report_B (4th) Pattern)

希望の出力は次のとおりです。

INC-220721-00007628, 8/1/2022 6:15, Report_A

後で次の出力が必要になる場合があります。

INC-220721-00007628, 8/1/2022 6:15, Report_A, Report_B

私はCygwinとCentOS 7環境を使用しています。

有用な解決策に感謝します。

ベストアンサー1

perl代わりに使用しますawk(gawkも使用します。使用するコードはgawkによって異なります)。

perl -l -0777 -ne '
  $time = $& if m{\b\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{1,2}\b};
  $inc = $& if /\bINC-\d+-\d+\b/;
  @reports = /\bReport_\S+/g;
  print join ", ", $inc, $time, @reports
    if defined($time) && defined($inc)' your-file

おすすめ記事