
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
答え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///
コマンドでは改行文字の挿入に問題はありません。