spr*_* cc 6 sorting shell awk cut sed
我想按照之前的最后一个数字排序space.这是一个简化的例子:
c3_abl_eerf_14 sasw
a.bla_haha_2 dnkww
s.hey_3 ddd
Run Code Online (Sandbox Code Playgroud)
这就是我想要的结果:
a.bla_haha_2 dnkww
s.hey_3 ddd
c3_abl_eerf_14 sasw
Run Code Online (Sandbox Code Playgroud)
我不知道怎么做,也许是通过命令sort?并且,有时我使用了sort命令,它可能错误地处理了不到2的14,我不希望这种情况发生.
此命令链适用于您的示例:
sed -r 's/.*_([0-9]+) .*/\1 &/' file|sort -n|sed 's/[^ ]* //'
Run Code Online (Sandbox Code Playgroud)
这个想法是
无论数字在哪里,都按行中的最后一个数字排序:
awk -F'[^0-9]+' '{$0=(length($NF)?$NF:$(NF-1)) OFS $0}7' file|sort -n|sed 's/[^ ]* //'
Run Code Online (Sandbox Code Playgroud)
如果你想用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);
}
}
Run Code Online (Sandbox Code Playgroud)
其工作方式如下:BEGIN规则设置字段分隔符(您也可以在命令行上执行此操作).第二个规则适用于输入的所有行,并将它们放入由第二个但最后一个字段中的数字索引的关联数组中.该END规则数组的索引排序成第二阵列和下面的循环打印出数值,现在可以正确排序.