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

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,我不希望这种情况发生.

Ken*_*ent 8

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

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)


Mic*_*hrs 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

其工作方式如下:BEGIN规则设置字段分隔符(您也可以在命令行上执行此操作).第二个规则适用于输入的所有行,并将它们放入由第二个但最后一个字段中的数字索引的关联数组中.该END规则数组的索引排序成第二阵列和下面的循环打印出数值,现在可以正确排序.