【问题标题】:How to sort by 2 different columns?如何按2个不同的列排序?
【发布时间】:2013-07-16 09:44:46
【问题描述】:

我想按 2 个不同的列对文本进行排序:

aaa5aaaaa
aaa3azaba
aaa4aaaaa
aaa3abaza

第一次排序必须只在第 4 列,并且如果有相同的数字 p.e.在上面的示例“3”中,第二次排序必须在第 8 列,如果仍然有相同的字符,则下一列必须是 9 等。

我认为这将是解决方案:

%sort i /\%4v\|\%8v/

但它不起作用。

输出:

aaa3abaza
aaa3azaba
aaa4aaaaa
aaa5aaaaa

预期输出:

aaa3azaba
aaa3abaza
aaa4aaaaa
aaa5aaaaa

【问题讨论】:

  • 按第 8 列排序,然后再按第 4 列排序 :)

标签: sorting vim multiple-columns


【解决方案1】:

你的尝试有什么问题:

  • 内置:sort/pattern/ 参数指定要跳过的文本;您显然是在尝试匹配某些列。
  • \%v 原子是零宽度,因此您可能需要附加一个. 以使其与字符匹配(如果尽管有第一点这仍然有效)。
  • 我认为根本没有办法使用内置的:sort 指定多个搜索键(即您的字符位置 4 和 8)。

如果你安装了 GNU sort(即 Linux 系统或通过 Cygwin),你可以使用这个外部命令:

:%!sort -k1.4,1.4 -k1.8,1.8

这将第 4 列和第 8 列这两个字符指定为作为排序键的第一个字段 (1.) 的偏移量。

【讨论】:

  • 非常好!是的,我安装了 GNU Sort。您知道在哪里可以找到有关偏移值的更多信息吗?体育如果我只想在第 4 列和第 8 列及之后(> = 8)排序,偏移值是多少?我还没有发现如何对一列 p.e 进行排序。上校4 正常和第 8 列反转...
  • 对于 >= 列,只需省略第二个 ,1.x 值;附加r 进行反向排序。 man sort 是否已为您提供所有信息,并且在 SO 上围绕 sort 有几个问题。
【解决方案2】:

这一行:

sor /\%7v/|sor n /\%3v/

适用于您的示例。

它进行两次排序,首先按 col8 排序,然后按 col4 排序(作为数字)。

【讨论】:

  • 请注意,这取决于:sort 是一个稳定的排序,并且'关于排序的细节取决于使用的库函数。不能保证排序是“稳定的”或服从当前的语言环境。 (来自:h :sort
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 2021-10-15
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
相关资源
最近更新 更多