我想根据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,我不希望这发生。
答案 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
规则将此数组的索引排序为第二个数组,以下循环打印现在已排序的值。