根据部分行比较删除重复行

Bru*_*uno 4 vim

我有一个包含数千行文本的文本文件,如下所示.

123 hello world
124 foo bar
125 hello world
Run Code Online (Sandbox Code Playgroud)

我想通过检查该行的子部分来测试重复项.对于上面它应该输出:

123 hello world
124 foo bar
Run Code Online (Sandbox Code Playgroud)

是否有可以执行此操作的vim命令?

更新:我在Windows机器上,所以不能使用uniq

kev*_*kev 8

这是一个bash命令:

sort -k2 input | uniq -s4
Run Code Online (Sandbox Code Playgroud)
  • sort -k2 排序时将跳过第1个字段
  • uniq -s4 将跳过前4个字符

在vim中,您可以调用上面的外部命令:

:%!sort -k2 % | uniq -s4
Run Code Online (Sandbox Code Playgroud)
  • 第二个%将扩展为当前文件名.

实际上,您可以使用以下命令在vim中进行排序:

:sort /^\d*\s/
Run Code Online (Sandbox Code Playgroud)
  • vim将在排序时跳过匹配的数字

排序后,使用此命令删除重复的行:

:%s/\v(^\d*\s(.*)$\n)(^\d*\s\2$\n)+/\1/
Run Code Online (Sandbox Code Playgroud)
  • 为了避免过多的反斜杠转义,我\v在模式中使用了非常魔法.
  • 在多行模式中,$将在换行符(\n)之前匹配位置.不过,我认为这不是必要的.
  • 你可以制作自己的正则表达式.