如何在vi编辑器中删除非连续的重复行而无需排序?

4
我知道如何在vi中删除连续的重复内容。要么
:%!uniq 

或者
:g/^\(.*\)$\n\1$/d). 

但是我有一个文件,其中的数据是随机排列的,并且有一些重复的行在整个文件中分散出现。如何在不干扰行顺序的情况下删除所有重复项?应该保留第一行独特的行,接下来(或所有其他)的副本应该被删除?

例如:cat file1

Here's looking at you, Kid.
Casablanca 
Here's looking at you, Kid.
Go ahead, make my day. 
Dirty Harry
sleep 5
Go ahead, make my day. 
Yippee-ki-yay

输出应该是:
Here's looking at you, Kid.
Casablanca 
Go ahead, make my day. 
Dirty Harry
sleep 5
Yippee-ki-yay
1个回答

7

有一个awk的命令非常方便:

$ awk '!a[$0]++' file
Here's looking at you, Kid.
Casablanca 
Go ahead, make my day. 
Dirty Harry
sleep 5
Yippee-ki-yay

它跟踪处理数组a[]中的行。每当该行再次出现时,计数器已经是正数,因此条件为false,该行不会被打印。

如果您想在vim中运行它,请执行以下操作:

:%!awk '\!a[$0]++'
        ^^
       you have to escape the ! to be treated properly

谢谢。这是一个优雅的解决方案。 - Ajim Bagwan
很高兴看到这个 :) 我刚刚注意到我回答了你很多问题呢,嘿嘿。 - fedorqui
没错,你是一个快速的救星。谢谢。 - Ajim Bagwan
1
最佳答案。谢谢! - Luciano Fantuzzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接