5

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

123 hello world
124 foo bar
125 hello world

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

123 hello world
124 foo bar

有没有一个vim命令可以做到这一点?

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

4

4 回答 4

8

这是一个 bash 命令:

sort -k2 input | uniq -s4
  • sort -k2排序时将跳过第一个字段
  • uniq -s4将跳过前 4 个字符

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

:%!sort -k2 % | uniq -s4
  • 第二个%将扩展为当前文件名。

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

:sort /^\d*\s/
  • vim 将在排序时跳过匹配的数字

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

:%s/\v(^\d*\s(.*)$\n)(^\d*\s\2$\n)+/\1/
  • 为了避免过多的反斜杠转义,我\v在模式中使用打开VERY MAGIC
  • 在多行模式中,$将匹配 newline( ) 之前的位置\n。不过,我认为这里没有必要。
  • 您可以制作自己的正则表达式。
于 2012-11-06T15:24:30.093 回答
1

使用 awk:

$ awk '!a[$2$3]++' file
123 hello world
124 foo bar

进入数组时的第一个元素将计数设置为 1,因此进一步出现的元素不会进入数组,因为否定使其为假。

于 2012-11-06T15:37:40.573 回答
0

我不确定在 vim 中,但你可以用 uniq 命令做一些事情。它有一个 --skip-fields 参数,可用于跳过每行的第一部分。

$ cat test.txt
123 hello world
124 foo bar
125 hello world

$ cat test.txt | sort -k 2 | uniq --skip-fields=1 | sort
123 hello world
124 foo bar
于 2012-11-06T15:25:33.673 回答
-1

在 VIM 中,我可以使用以下命令对重复项进行排序和删除

:sort u
于 2016-02-17T14:12:50.337 回答