我有一个包含数千行文本的文本文件,如下所示。
123 hello world
124 foo bar
125 hello world
我想通过检查该行的一个子部分来测试重复项。对于上面它应该输出:
123 hello world
124 foo bar
有没有一个vim命令可以做到这一点?
更新:我在Windows机器上,所以不能使用 uniq
我有一个包含数千行文本的文本文件,如下所示。
123 hello world
124 foo bar
125 hello world
我想通过检查该行的一个子部分来测试重复项。对于上面它应该输出:
123 hello world
124 foo bar
有没有一个vim命令可以做到这一点?
更新:我在Windows机器上,所以不能使用 uniq
这是一个 bash 命令:
sort -k2 input | uniq -s4
sort -k2
排序时将跳过第一个字段uniq -s4
将跳过前 4 个字符在 vim 中,你可以调用上面的外部命令:
:%!sort -k2 % | uniq -s4
%
将扩展为当前文件名。实际上,您可以使用以下命令在 vim 中排序:
:sort /^\d*\s/
排序后,使用此命令删除重复的行:
:%s/\v(^\d*\s(.*)$\n)(^\d*\s\2$\n)+/\1/
\v
在模式中使用打开VERY MAGIC。$
将匹配 newline( ) 之前的位置\n
。不过,我认为这里没有必要。使用 awk:
$ awk '!a[$2$3]++' file
123 hello world
124 foo bar
进入数组时的第一个元素将计数设置为 1,因此进一步出现的元素不会进入数组,因为否定使其为假。
我不确定在 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
在 VIM 中,我可以使用以下命令对重复项进行排序和删除
:sort u