特定のテキストを含む重複行を削除する

特定のテキストを含む重複行を削除する

百万行を含む大きなテキストファイルがあります。私の特定のテキストに一致する同じ行を見つけ、最初の項目をそのままにしたいと思います。どんなアイデアがありますか?

したがって、アルゴリズムはおおよそ次のようになります。

For all lines in text file
   Find duplicate lines
   If duplicated line contains our text
      Remove all these lines except the first one

たとえば、「Word」というテキストの重複行を探しています。
ファイルの例:

Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5

結果ファイル:

Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

答え1

簡単なアプローチは次のとおりです。

awk '!/Word/ || !a[/Word/]++' file

awk 'm=!/Word/ || !a[!m]++'

つまり、Wordなしですべての行を印刷するか、Wordがある場合はWordを使用して最初の行のみを印刷し、残りは抑制します。

注:Wordのコンテンツを強化する必要があるかもしれません。練習用に残しておきます。

答え2

部分正規表現比較を実行する場合(参照https://stackoverflow.com/questions/65621325/how-do-i-find-the-text-that-matches-a-pattern):

$ awk -v regexp='Word' '!(($0 ~ regexp) && seen[$0]++)' file
Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

または部分文字列の比較が必要な場合:

$ awk -v string='Word' '!(index($0,string) && seen[$0]++)' file
Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

他の種類の一致が必要な場合は、質問を編集して明確にしてください。

答え3

次のことを試すことができます。

sed '0,/Word/b;/Word/d' file

「Word」に一致する行を削除する:

/Word/d 

ファイルの先頭から「Word」と一致する最初の行まで、スクリプトの最後に分岐します。つまり、削除コマンドをスキップします。

0,/Word/b

~からこのスタックオーバーフロー投稿

関連情報