如何在Vim中对数字和文本列进行排序

59

使用 Vim 6.0。假设我正在编辑这个文件:

sdfsdg
dfgdfg

34     12
2      4
45     1
34     5

如何对第二列进行排序?


3
如果你的第二个(或第三个、第四个……)列恰好是带有小数的第一列,请注意可以简单使用 :sort n,因为帮助文档中说:“使用 [n] …… 在行中对第一个小数进行排序……” 这不适用于你的情况,但可能适用于其他人的情况。 - Rabarberski
5个回答

63

如果您有可靠的shell,请选择您的数字并运行命令。

:'<,'>!sort -n -k 2

如果你在可视模式下输入这个命令,那么在你输入冒号后,标记符号'<,'>将自动出现,然后你只需要继续输入剩余的内容。

这种类型的命令(:[motion]!)被称为过滤。你可以通过查阅vim的帮助来了解更多:

:h filter

一个关于编程的例子:'<,'>!sort -n -k 2 ? - vehomzzz
5
这是一个可视化模式的命令 - Pavel使用 V 选择一段范围,然后输入 :,这会自动插入可视化选择范围 '<,'>,然后再输入实际命令 !sort -n -k 2。当然,您可以按照任何方式指定范围 - 如果您感兴趣,请查看 :help range - Cascabel
等一下,这太棒了。我想使用GNU sort的-h标志按人类可读数字进行排序,以便将最大的文件显示在顶部::'<,'>!sort -hr - twhitney
1
大多数这些解决方案(包括此方案和下面的大部分方案)都有效。然而,当行具有相同的键(列)值时,它们都无法保留原始顺序中的行。最终我不得不编写一个Java程序来实现这种行为。 - John kendall

50

使用Vim的sort命令按照第二列N对所有行进行排序,例如:

:sort /.*\%2v/ 

参考链接:vimtips.txt


12
哇,Vim 内置排序程序!这个家伙有多强大啊?! - P Shved
你有任何升级的理由吗? vim.org 确实说7.2是最新的稳定版本。 - Mark Rushakoff

26

对于vim7,我会选择:

:sort n /.*\s/

这将对数字进行排序,忽略给定正则表达式匹配的文本。在您的情况下,是第二列。


23

在可视化模式下按第二列排序(例如Control+v),然后运行:

!sort

或者按照第三列进行排序

sort -k 3 
或者
:sort /.*\%3v/

或者使用 Shift+V 命令选择您想要排序的行。然后输入。

!sort -k 3n

或者使用以下代码告诉Vim跳过每行的前两个单词,然后按照其余内容进行排序:

:%sort /^\S\+\s\+\S\+\s\+/ 

或者排序方式为按照第8行:

:sort /.*\%55v/
'virtual' 规范是列的绝对数量,将空格+制表符视为单个字符(简而言之,它不会将制表符视为八个空格),因此要按最后一列排序:
:%sort /\<\S\+\>$/ r

这应该是答案。但是sort!命令也不错。 - firedev

0
如果有更多的列,您可以使用重复来避免复杂的模式。
例如,这将按第100列(此处的“列”指空格分隔的列)对整个文件进行排序。
:%sort /^\(\S\+\s\+\)\{99}/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接