2017-02-03 6 views
0

私はlinuxのテキストファイルの下にフォーマットしようとしています。あなたは私の出力を達成するための最良の方法が何かを提案することができますか?私は事前に私の入力テキストをlinuxシェルで出力するための最良の方法は何ですか

Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 1 
Trailer | Trailer Identifer 
Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 2 
Trailer | Trailer Identifer 

感謝を生成しようとしています

入力テキスト

Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 1 
[2017-02-03 14:23:45,066] - Message 1 
[2017-02-03 14:23:46,066] - Message 1 
[2017-02-03 14:23:47,066] - Message 1 
Trailer | Trailer Identifer 
Header| Header Identifier 
[2017-02-03 14:23:44,066] - Message 2 
[2017-02-03 14:23:45,066] - Message 2 
[2017-02-03 14:23:46,066] - Message 2 
[2017-02-03 14:23:47,066] - Message 2 
Trailer | Trailer Identifer 

出力!

更新:私はここで重複を削除しようとしていません、私は最も低いタイムスタンプでレコードを保持し、他のものを削除したいと思います。

+0

「awk」のようなものがあります。[$ 0] ++ 'file'はうまくいくはずです(フィールドセパレータで遊ぶ必要があります)。この質問はbashにはよくあることですが、私は正確な複製を見つけることができません – Aserre

+0

@Aserre:2番目の見方では、これはあなたが投稿したものの複製のようには見えません。 OPは入力ファイルを出力順に並べ替える必要があります。私は、出力が複数の行を再フォーマットしていると仮定しています – Inian

+0

@Inianええ、私はタイムスタンプがOPの入力で正確に同一ではなかったことに気付かなかった。また、メッセージ1とメッセージ2が一意でない場合、「Header/Trailer」ブロックに従ってログメッセージを処理する必要があります。 – Aserre

答えて

2

そのためのbashコマンドはuniqです。そのコマンドを入力します。

uniq -f3 file 

あなたは、コマンドがまだあなたのユースケースで動作する幸運で、awkを使用したプログラミングする必要はありません。私は、manページの一部を引用:

uniqのフィルターINPUT(または標準入力)から隣接一致する行、OUTPUT(または標準出力)に書き込みます。

オプション-f3は、最初の3つのフィールドの比較を避けます。

+0

ありがとう!あなたは私の日を救った。それは完全に動作します。私はここで新しいので、私はこの答えをupvoteすることができません。 –

0

@Abhishekナラヤンは:試してみてください:

awk --re-interval '/[0-9]{4}-[0-9]{2}-[0-9]{2}/ && !Q{print;Q=1;next} !/[0-9]{4}-[0-9]{2}-[0-9]{2}/{Q="";print}' Input_file 

をごINPUT_FILE日付の順に並べ替えられたことを考えます。私は日付の正規表現をチェックして、Qの値がnullであるかどうかをチェックしています。行を出力し、Qの値を1に設定します。この線。

関連する問題