Vim 基于部分行比较删除重复行

Vim 基于部分行比较删除重复行,vim,Vim,我有一个包含数千行文本的文本文件,如下所示 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个

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

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/
  • 排序时,vim将跳过匹配的数字
排序后,使用此命令删除重复的行:

:%s/\v(^\d*\s(.*)$\n)(^\d*\s\2$\n)+/\1/
  • 为了避免太多反斜杠转义,我在模式中使用
    \v
    来启用非常神奇的
  • 在多行模式中,
    $
    将匹配换行符前面的位置(
    \n
    )。不过,我认为这里没有必要
  • 你可以自己制作正则表达式

我不确定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
使用awk:

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

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

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

:sort u

您的
:sort/^\d*\s/
命令没有删除包含“hello world”的第二行,但现在有了:)这是一个很好的解决方案。我想uniq中缺少的-u标志应该是
uniq-s4-u
,或者更好的
uniq-k1-u
跳过第一个字段(假设该数字可以有多于/少于3位)使用Windows并不是没有nix工具的借口!在Sourceforge上!