我有一个包含一百万行的大文本文件。我想找到与我的特定文本匹配的相同行,并保持第一次出现的完整。有任何想法吗?
所以算法大致应该如下:
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