如何将文件行排序到末尾的第二个单词

时间:2016-06-08 08:01:11

标签: shell sorting awk sed cut

我想根据space之前的最后一个数字对该行进行排序。这是一个简化的例子:

c3_abl_eerf_14 sasw
a.bla_haha_2 dnkww
s.hey_3 ddd

这就是我想要的结果:

a.bla_haha_2 dnkww
s.hey_3 ddd
c3_abl_eerf_14 sasw

我不知道如何执行此操作,可能是通过命令sort?并且,有时我使用sort命令,它可能错误地处理少于2的14,我不希望这发生。

2 个答案:

答案 0 :(得分:8)

此命令链适用于您的示例:

sed -r 's/.*_([0-9]+) .*/\1 &/' file|sort -n|sed 's/[^ ]* //'

这个想法是

  • 首先提取数字,添加到行的开头
  • 按此号码排序所有行
  • 删除号码

更新

按行中的最后一个数字排序,无论数字在哪里:

awk -F'[^0-9]+' '{$0=(length($NF)?$NF:$(NF-1)) OFS $0}7' file|sort -n|sed 's/[^ ]* //'

答案 1 :(得分:6)

如果你想用GNU awk做,请试试这个:

BEGIN { FS = "[ _]+" }
{ data[$(NF-1)] = data[$(NF-1)] "\n" $0}
END {
    n = asorti(data, sorted, "@val_num_asc");
    for (i = 1; i <= n; i++) {
        print substr(data[sorted[i]], 2);
    }
}

此操作如下:BEGIN规则设置字段分隔符(您也可以在命令行上执行此操作)。第二个规则适用于输入的所有行,并将它们放入由第二个但最后一个字段中的数字索引的关联数组中。 END规则将此数组的索引排序为第二个数组,以下循环打印现在已排序的值。