如何在不排序的情况下删除vi中不连续的重复行?

Aji*_*wan 4 unix vi shell

我知道如何在 vi 中删除连续的重复项。任何一个

:%!uniq 
Run Code Online (Sandbox Code Playgroud)

或者

:g/^\(.*\)$\n\1$/d). 
Run Code Online (Sandbox Code Playgroud)

但是我有一个文件,其中包含随机顺序的数据,并且有一些重复的行分散在整个文件中。如何在不干扰行顺序的情况下删除所有这些重复项?应该保留第一个唯一行,并删除下一个(或其余所有)重复项?

例如 cat 文件 1

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
Run Code Online (Sandbox Code Playgroud)

输出应该是:

Here's looking at you, Kid.
Casablanca 
Go ahead, make my day. 
Dirty Harry
sleep 5
Yippee-ki-yay
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 7

有一个 awk liner 非常少:

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

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

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

:%!awk '\!a[$0]++'
        ^^
       you have to escape the ! to be treated properly
Run Code Online (Sandbox Code Playgroud)