日付に基づいて線を分割

日付に基づいて線を分割
Thu_Jun_04_09:22:50_2020=abcd:some_string=Thu_Jun_04_09:39:54_2020=efgh:some_string=Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

上記の出力がありますが、次の形式が必要です。

Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

日付に基づいて線を分割する方法はありますか?

ベストアンサー1

inputがあると仮定すると、file次のことができます(GNU sed):

$ sed 's/=/\n/2;P;D' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

s/=/\n/22番目の文字を改行文字=に置き換えます。\nこれにより、P;現在のパターンスペースのすべての内容が最初のパターン(現在読んでいるもの)まで印刷され、パターンスペースが消去され、プロセスを再開できます。これは次の場所に記録されます。\nDman sed

   D      If pattern space contains no newline, start a normal  new  cycle
          as  if  the d command was issued.  Otherwise, delete text in the
          pattern space up to the first newline, and  restart  cycle  with
          the  resultant  pattern space, without reading a new line of in‐
          put.
   P      Print  up  to  the first embedded newline of the current pattern
          space.

または、GNUを使用してgrep次のことを実行できます。

$ grep -oP '[^=]+=[^=]+' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

その後、文字以外の部分を見つけて、=a =、別の部分ではない部分を見つけます=。 grepに行の一致する部分だけを印刷するように指示する-oと、結果は探しているグループが印刷されます。


awk別のオプションは、withを入力フィールド区切り文字として使用=し、フィールドをペアで印刷することです。

$ awk -F= '{for(i=2;i<=NF;i+=2){print $(i-1)"="$i}} ' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

おすすめ記事