删除vi中的重复行?

Syd*_*ius 112 vim duplicates

我有一个文本文件,其中包含一长串条目(每行一个).其中一些是重复的,我想知道是否有可能(如果是这样,如何)删除任何重复.如果可能的话,我有兴趣在vi/vim中执行此操作.

Bri*_*per 234

如果您可以对文件进行排序,则可以使用:

:sort u
Run Code Online (Sandbox Code Playgroud)

  • 如果不能接受排序,请使用``:%!uniq``来删除重复的条目而不对文件进行排序。 (3认同)
  • 这真是太美了.谢谢! (2认同)
  • @cryptic0,除非对重复项进行排序,否则 uniq 将无法工作`a$b$a$` 不执行任何操作 (2认同)

Sea*_*ean 25

试试这个:
__CODE__

在尝试之前复制一份.这是未经测试的.

  • 唯一的问题是,如果有多个重复项(同一行中有3个或更多行),则必须运行多次,直到所有重复项都消失了,因为这一次只能删除一组重复项。 (3认同)
  • 这为我提供了所有重复的行,但是没有删除,我在这里错过了一步吗? (2认同)
  • 这样做的另一个缺点:除非重复的行已经相邻,否则这将无法工作。首先排序将是确保它们彼此相邻的一种方法。到那时,其他答案可能更好。 (2认同)

Kev*_*vin 22

从命令行只需:

sort file | uniq > file.new
Run Code Online (Sandbox Code Playgroud)

  • 对于一个大文件来说,这对我来说非常方便。谢谢! (2认同)
  • “uniq”不被识别为内部或外部命令、可操作程序或批处理文件。 (2认同)
  • 是的——我在 2.3 GB 的文件上尝试了这种技术,速度快得惊人。 (2认同)

Rov*_*ari 7

awk '!x[$0]++' yourfile.txt如果你想保留订单(即排序是不可接受的).为了从vim调用它,:!可以使用.

  • 这很可爱!不需要排序是*完全*我正在寻找的! (3认同)
  • 如果你喜欢“perl -nle 'print except $seen{$_}++' yourfile.txt”,这也可以在 perl 中完成。 (2认同)

Bri*_*gey 6

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

适用于Windows.必须首先排序行.


Jon*_*Oro 5

我将结合以上两个答案:

go to head of file
sort the whole file
remove duplicate entries with uniq

1G
!Gsort
1G
!Guniq
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣查看删除了多少重复行,请使用control-G之前和之后检查缓冲区中存在的行数.