次の内容のテキストファイルがあります
$ cat foo.txt
some text
[email protected]
8903457923
2018-02-09 07:12 (Asia/Kolkata)
again some text over here
some more text again
Message
some text
[email protected]
8903457923
2018-02-05 07:12 (Asia/Kolkata)
again some text over here
some more text again
Message
次の出力を取得したい
$ cat foo.txt
some text [email protected] 8903457923 2018-02-09 07:12 (Asia/Kolkata) again some text over her some more text again Message
some text [email protected] 8903457923 2018-02-05 07:12 (Asia/Kolkata) again some text over here some more text again Message
Trを使用し、「メッセージ」を共通の文字列として使用することで、これを実現できると思います。しかし、これを実装する方法がわかりません。
現在の行が「メッセージ」でない場合は、OFSで結合された行をリストに追加します。 「メッセージ」が表示されたら、現在のリストを印刷します(OFSと現在の「メッセージ」行が結合されています)。
_awk '/^Message$/ { print t OFS $0 ORS; t=""; } !/^Message$/ { t=(t ? t OFS $0 : $0) }' < foo.txt
_
t=(t ? t OFS $0 : $0)
部分は三項演算子です。 t
が空かどうかを確認します。そうである場合は、現在の行をそれに割り当てます。それ以外の場合は、現在の値にOFSの後に現在の行を追加します。
出力:
_some text [email protected] 8903457923 2018-02-09 07:12 (Asia/Kolkata) again some text over here some more text again Message
some text [email protected] 8903457923 2018-02-05 07:12 (Asia/Kolkata) again some text over here some more text again Message
_
aWKで少し簡単な方法:
awk 'BEGIN { ORS=RS="Message\n" } gsub("\n"," ")' ./in.txt
tr
とsed
の使用:
tr '\n' '\t' <foo.txt | sed -e $'s/Message\\\t/Message\\\n\\\n/g'
これにより、すべての改行がタブに変換され、Message
が出現するたびに2つの改行が追加されます。
このsedを試すことができます
sed ':A;/Message/!{N;bA};y/\n/ /;$!G' foo.txt
メッセージが表示されるまで、パターン空間で行を取得します。
各改行を空白スペースに置き換えます。
最後でない場合にのみ空白行を追加します。