如何对包含特定单词的行的列进行排序

时间:2009-09-03 12:00:37

标签: vim

我想仅对包含某个单词的行对某个列进行排序。我不希望看到不包含该字的行。例如,我有这个文本文件:

 sdf ggfds   7
 sdf sgs     5
 sdf dfgs    3
 foo dffg    2
 bar dffg    2
 sdf sddfg   4

我想为仅包含“sdf”字的行排序第3列(不必在第一列中)

我希望看到这个输出:

 sdf dfgs    3
 sdf sddfg   4
 sdf sgs     5
 sdf ggfds   7

4 个答案:

答案 0 :(得分:16)

将输入传输到外部命令:

:%!grep sdf | sort -n -k3

详细说明:

  1. 使用'%'
  2. 选择整个内容
  3. 使用'!'
  4. 将其传递给外部命令
  5. grep onyl包含'sdf'
  6. 的行
  7. 在第三个字段(-k3)
  8. 上以数字(-n)对这些行进行排序

答案 1 :(得分:8)

2个vim命令:

:v/sdf/d
:sort n /[^[:digit:]]*/
  • 首先删除所有不包含'sdf'
  • 的行
  • 第二个排序忽略非数字的数字

答案 2 :(得分:3)

Maxim Kim已经给出了一个很好的答案,我将在评论中添加这个,但它太复杂了,所以我会坚持回答:

您可以使用以下方法简化模式:

:v/sdf/d
sort n /\D*/

因为\D相当于[^[:digit:]]而且输入的次数要少得多。有关更多信息,请参阅

:help \D

要特别匹配第三个字段,而不仅仅是第一个数字,请使用

:sort n /\(\S\+\s+\)\{2}/`

:sort n /\v(\S+\s+){2}/

请参阅:

:help :sort
:help \S
:help \s
:help pattern.txt
:help \v

另外,有些人发现更容易记住:g!/sdf/d,与:v/sdf/d相同 - :g!:g相反,与{:v相同1}}。

:help :v
:help :g

答案 3 :(得分:3)

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

!sort

或按第3栏排序

sort -k 3 

:sort /.*\%3v/

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

!sort -k 3n

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

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

或者按第8行排序:

:sort /.*\%55v/

'virtual'规范是列的绝对数,它将空格+制表符视为单个字符(很快,它不会将制表符视为八个空格),

所以要按最后一栏排序:

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