![删除包含特定文本的重复行](https://linux22.com/image/186332/%E5%88%A0%E9%99%A4%E5%8C%85%E5%90%AB%E7%89%B9%E5%AE%9A%E6%96%87%E6%9C%AC%E7%9A%84%E9%87%8D%E5%A4%8D%E8%A1%8C.png)
我有一个包含一百万行的大文本文件。我想找到与我的特定文本匹配的相同行,并保持第一次出现的完整。有任何想法吗?
所以算法大致应该如下:
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