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