Vim 如何运行‘;:排序u’;命令,但仅使用特定列中的值作为排序键?
我正在寻找一个更具体版本的Vim 如何运行‘;:排序u’;命令,但仅使用特定列中的值作为排序键?,vim,Vim,我正在寻找一个更具体版本的:sort u命令,该命令允许从文件中删除所有重复的行。我正在处理一个CSV文件,希望删除第二列条目中的所有重复行。换句话说,如果第二列中的两行具有相同的值,则将它们声明为重复的 例如,对于以下文件: a,1,b g,1,f c,1,x i,2,l m,1,k o,2,p u,1,z 有关命令应给出: a,1,b i,2,l 选择要保留的特定行并不重要,只要第二列条目都是唯一的 哪个Vim命令将产生上述输出 谢谢 因为不可能在 运行一次:sort命令,让我们将其作为
:sort u
命令,该命令允许从文件中删除所有重复的行。我正在处理一个CSV文件,希望删除第二列条目中的所有重复行。换句话说,如果第二列中的两行具有相同的值,则将它们声明为重复的
例如,对于以下文件:
a,1,b
g,1,f
c,1,x
i,2,l
m,1,k
o,2,p
u,1,z
有关命令应给出:
a,1,b
i,2,l
选择要保留的特定行并不重要,只要第二列条目都是唯一的
哪个Vim命令将产生上述输出
谢谢 因为不可能在 运行一次
:sort
命令,让我们将其作为两个步骤来处理
1。第一步是根据第二列的值对行进行排序
(用逗号与第一个分隔)。为了做到这一点,我们可以
使用:sort
命令,传递与
第一列和以下逗号:
:sort/^[^,]*,/
As:sort
比较匹配后刚开始的文本
在每行指定的模式,它为我们提供了所需的排序
行为。比较数值,而不是
按字典顺序,使用n
标志:
:sort n/^[^,]*,/
2.第二步是遍历已排序的行并删除
所有行,但每个连续行块中有一行具有相同的
第二列中的值。构建我们的实现非常方便
在执行:global
命令时,在每个
与特定图案相匹配的线条。就我们的目的而言,一条线可以是
如果第二列中的值与
下面一行。这种形式化伴随着最初的
假设逗号不能出现在列值中,这给了我们
以下模式:
^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*
如果我们在满足此条件的每一行上运行:delete
命令
模式,按顺序从上到下排列,我们将
第二列中的每个不同值只有一行:
:g/^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*/d_
3.最后,这两个步骤可以组合在一个Ex命令中:
:sort/^[^,]*,/|g/^[^,]*,\([^,]*\),.*\n[^,]*,\1,.*/d_
:排序/\([^,]*,\)\{1}/
:g/\%(\%([^,]*,\)\{1}\1.*\n\)\@使用第二列
(visual + !sort)
使用第三列
sort -k 3
或
或
或
跳过每行的前两个单词,并按以下内容排序:
:%sort /^\S\+\s\+\S\+\s\+/
或
按最新列排序
:%sort /\<\S\+\>$/ r
:%sort/\$/r
或
使用其他程序,如MS OFFICE或OPENOFFICE为什么必须在vim
中执行此操作?我不得不认为,使用真正的CSV解析器来完成这项工作会更容易。(除非您确信您的输入永远不会有,
嵌入带引号或反斜杠样式转义的值…)它不必在vim中完成;我在问你怎么做维姆。我可以想出很多其他的方法来做。。。但是我正在寻找一个vim解决方案。哇,这确实有效。你能解释一下发生了什么吗?哦,这和伊布的答案差不多。当时我没有意识到。由于列索引参数的差异而保留,这是正确的。这个想法基本相同,只是你的模式向后看,而我的模式向前看(更简单)。顺便说一句,有些情况下,你的第二个命令不能正常工作。例如,当在两行测试文件a,1,2
,b,2,c
上运行时,它会错误地删除第二行。我认为,该命令应该是:g/\%(^\%([^,]*,\)\{1}\1.*\n\)\@您的建议都不能用于CSV(根据定义:逗号分隔)。
select the lines you wish to sort using the Capital V command. Then enter
!sort -k 3n
:%sort /^\S\+\s\+\S\+\s\+/
:%sort /\<\S\+\>$/ r