ある行から文字列を検索し、その行を別のファイルに一度だけ印刷します。

ある行から文字列を検索し、その行を別のファイルに一度だけ印刷します。

タイムスタンプ付きの一意の行を含むテキストファイルがあります。以下は、テキストファイルの行の例です。

111.111.11.11: 2017 年 6 月 18 日 08:01:34: abc\ジョン・ドウ1Windows...

111.111.11.11: 2017 年 6 月 18 日 09:01:34: abc\ジョン・ドウ2Windows...

111.111.11.11: 2017 年 6 月 18 日 09:30:34: abc\ジョン・ドウ2Windows...

111.111.11.11: 2017 年 6 月 18 日 10:01:34: abc\ジョン・ドウ3Windows...

111.111.11.11: 2017 年 6 月 18 日 11:01:34: abc\ジョン・ドウ1Windows...

111.111.11.11: 2017 年 6 月 18 日 12:01:34: abc\ジョン・ドウ3Windows...

111.111.11.11: 2017 年 6 月 18 日 13:01:34: abc\ジョン・ドウ3Windows...

...

このラインは長い道のりを行きます。行の最初の項目を移動する必要があります。ジョン・ドウ1他のテキストファイルで発生し、john.doe1を含む他のすべての行を無視します。私はファイル全体に対して同じことをする必要があります。ジョン・ドス

他のファイルへの出力は次のようになります。

111.111.11.11: 2017 年 6 月 18 日 08:01:34: abc\ジョン・ドウ1Windows...

111.111.11.11: 2017 年 6 月 18 日 09:01:34: abc\ジョン・ドウ2Windows...

111.111.11.11: 2017 年 6 月 18 日 10:01:34: abc\ジョン・ドウ3Windows...

問題はジョン・ドス通常、実際の名前は以前は知らなかったので、文字「\」と「」の間に現れることだけがわかっていました。

答え1

おなじみのAwk重複排除イディオムを拡張してフィールドを区別するのではなく、一致する部分文字列を使用してください。

awk 'match($0, /\\[^ ]*/) && !seen[substr($0,RSTART,RLENGTH)]++' file

関連情報