【问题标题】:How to sort numeric and literal columns in Vim如何在 Vim 中对数字和文字列进行排序
【发布时间】:2009-08-30 21:51:28
【问题描述】:

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

sdfsdg
dfgdfg

34     12
2      4
45     1
34     5

如何对第二列进行排序?

【问题讨论】:

  • 相关,如果您的第二列(或第三、第四...)列恰好是带有十进制数的第一列,请注意您可以简单地使用:sort n,正如帮助所说:“使用 [n] ... 对行中的第一个十进制数进行排序...” 这不适用于您的情况,但可能适用于其他人。

标签: vim sorting


【解决方案1】:

如果你有不错的 shell,选择你的数字并运行命令

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

如果您要在可视模式下键入,在键入冒号后,标记“ 将自动出现,您只需键入其余部分。

这种类型的命令 (:[motion]!) 称为过滤。您可以通过咨询 vim 的帮助来了解更多信息:

:h filter

【讨论】:

  • 请举个例子:'!sort -n -k 2 ?
  • 这是一个可视模式命令 - Pavel 使用V 选择一个范围,然后输入:,它会自动插入可视选择范围'&lt;,'&gt;,然后输入实际命令@987654326 @。您当然可以以任何方式指定范围 - 如果您好奇,请参阅 :help range
  • 等等,这太棒了。我想使用 GNU sort 的 -h 标志对人类可读的数字进行排序,以在顶部显示最大的文件::'&lt;,'&gt;!sort -hr
  • 这些解决方案中的大多数(这个和下面的大多数)都有效。但是,当行具有相同的键(列)值时,它们都无法按原始顺序保留行。我最终不得不编写一个 Java 程序来获得这种行为
【解决方案2】:

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

:sort /.*\%2v/ 

参考:vimtips.txt

【讨论】:

  • 哇,vim 有内部排序程序!这混蛋有多大?!
  • 有什么原因不能升级? vim.org 确实说 7.2 是最新的稳定版本。
【解决方案3】:

对于 vim7 我会选择:

:sort n /.*\s/

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

【讨论】:

    【解决方案4】:

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

    !sort
    

    或按第三列排序

    sort -k 3 
    

    :sort /.*\%3v/
    

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

    !sort -k 3n
    

    或使用下面的代码告诉 Vim 跳过每行的前两个单词并按以下内容排序:

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

    或即按第 8 行排序:

    :sort /.*\%55v/
    

    'virtual' 规范是 column 的绝对数量,它将空格 + 制表符视为单个字符(简而言之,它不会将制表符算作八个空格),

    所以按最后一列排序:

    :%sort /\<\S\+\>$/ r
    

    【讨论】:

    • 这应该是答案。但是 shell sort! 也不错。
    【解决方案5】:

    如果有更多列,您可以使用重复来避免复杂的模式。
    例如,这将按第 100 列对整个文件进行排序(“列”在这里表示以空格分隔的列)

    :%sort /^\(\S\+\s\+\)\{99}/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      相关资源
      最近更新 更多