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
将跳过前导的4个字符uniq-s4
在vim中,您可以调用上面的外部命令:
:%!sort -k2 % | uniq -s4
- 第二个
将扩展到当前文件名%
实际上,您可以使用以下命令在vim中进行排序:
:sort /^\d*\s/
- 排序时,vim将跳过匹配的数字
:%s/\v(^\d*\s(.*)$\n)(^\d*\s\2$\n)+/\1/
- 为了避免太多反斜杠转义,我在模式中使用
来启用非常神奇的\v
- 在多行模式中,
将匹配换行符前面的位置($
)。不过,我认为这里没有必要\n
- 你可以自己制作正则表达式
$ 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上!