删除包含特定文本的重复行

删除包含特定文本的重复行

我有一个包含一百万行的大文本文件。我想找到与我的特定文本匹配的相同行,并保持第一次出现的完整。有任何想法吗?

所以算法大致应该如下:

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

这个 stackoverflow 帖子

相关内容