按特定列排序

时间:2013-04-21 21:20:00

标签: sorting vim

如果我的文本文件包含多个以制表符分隔的列,请执行以下操作:

1  foo  bar
3  bar  foo

我如何根据第二列或第三列进行排序?

我在可视模式或:'<,'>!sort -n -k 2中阅读过使用:sort /.*\%2v/的内容,但这些命令似乎都不起作用。

3 个答案:

答案 0 :(得分:4)

您可以使用内置的sort命令。

要按第二个制表符分隔列排序,您可以使用:sort /[^\t]*\t/对第二列进行排序。 要对第三列进行排序,您可以使用:sort /[^\t]*\t\{2}/

通常只需用列号减1替换数字。(即第一列为索引0的索引列)

答案 1 :(得分:0)

可悲的是,在同一个文件和/或一个命令中使用可视块似乎不可能,因为:ex是行式的,即 Ctrl-v + selection + :'<,'>sort只会对整行进行排序。

有点hacky“解决方案”是选择您想要使用可视块进行排序的任何内容,在另一个窗口中对其进行排序并将更改应用于原始文件。像这样:

Ctrl-v + selection + x + :tabnew + p + :sort + Ctrl-v G $ x + :q + `[P (对齐粘贴)

来源Barry Arthur - Sort Me A Column(来自#vim @ freenode的bairui)。

答案 2 :(得分:0)

通过sort调用的外部:'<,'>!sort -k 2确实有效。仅当给出-n标志(用于数字排序)但您要使用的列是非数字时,结果不符合预期。因此,要使用外部sort,只需在示例中删除-n

备注:同样:'<,'>sort /.*\%2v/对我有用。