日付に基づいて線を分割

日付に基づいて線を分割
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

答え2

$ tr '=' '\n' <file | paste -d '=' - -
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

まず=、を使用してすべての文字を改行文字に置き換え、次にを使用して2つの列に区切り文字で書式trを変更します。=paste


標準sed:

$ sed -e 'y/=/\n/' -e 's/\n/=/;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

まず、=パターン空間のすべての文字を改行文字に置き換えます。次に、最初の改行文字をに置き換えて、=パターンスペースの最初の部分(最大最初の改行文字まで)を印刷してから、印刷された部分を削除します。その後、残りのデータでループを再開します。

Teldenの答えGNUがあれば使用はしますが、sed移植はできません。入れるs///標準コマンドを使用すると、改行が可能ですsed。ただし、標準y///コマンドでは改行文字の挿入に問題はありません。

関連情報