Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 如何运行‘;:排序u’;命令,但仅使用特定列中的值作为排序键?_Vim - Fatal编程技术网

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