awk,如何在匹配单词后按数字排序

时间:2016-04-10 18:17:59

标签: sorting awk

我有一个这样的文本文件:

word_1 23.66 word_5 0 word_7 123
word_5 6 word_1 2 word_7 12
word_7 23.7 word_2 21 word_1 3
...

最好使用awk,如何按“word_1”后的数字对行进行排序?

2 个答案:

答案 0 :(得分:1)

我可以给你一些由sedsort组成的命令序列:

sed -r 's/(.*)(word_1 )([^ ]+)(.*)/\3\t&/' your_file | sort -n | sed -r 's/[^\t]+\t(.*)/\1/'
  1. sed会在word_1之后添加一个数字,并在行
  2. 之前添加一个标签
  3. 排序使用前置数字进行排序
  4. 第二个sed删除前缀数字和标签,保留原始行

答案 1 :(得分:1)

GNU awk支持根据索引或值对数组进行排序,请参阅联机帮助页中的PROCINFO["sorted_in"]

要实现您的目标,请执行以下操作:

sort.awk

# Sort the indices numerically descending
BEGIN { PROCINFO["sorted_in"] = "@ind_num_desc" }

# Use the number following "word_1" as the index in the h hash
{ 
  for (i=1; i<=NF; i++)
    if($i == "word_1") 
      h[$(i+1),NR] = $0
}

END { for(k in h) print h[k] }

像这样运行:

awk -f sort.awk infile

输出:

word_1 23.66 word_5 0 word_7 123
word_7 23.7 word_2 21 word_1 3
word_5 6 word_1 2 word_7 12