百万行を含む大きなテキストファイルがあります。私の特定のテキストに一致する同じ行を見つけ、最初の項目をそのままにしたいと思います。どんなアイデアがありますか?
したがって、アルゴリズムはおおよそ次のようになります。
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
~からこのスタックオーバーフロー投稿。