如何按最后一列数字排序?


23

我有这个输入:

sdkxyosl 1
safkls 2
asdf--asdfasxy_asd 5
dkd8k  jasd 29
sdi44sw 43
asasd afsdfs 10
rklyasd 4

我需要以下输出:

sdi44sw 43
dkd8k  jasd 29
asasd afsdfs 10
asdf--asdfasxy_asd 5
rklyasd 4
safkls 2
sdkxyosl 1

所以我需要按最后一列对行进行排序。

我不知道一行中有多少列。

我只是想不通,怎么做。我没有“ perl权力”。我只有sed,awk,cut等的平均脚本能力。

有人知道怎么做吗?

Answers:


34

以下命令行用于awk在file.txt的每一行的最后一个字段前添加前缀,进行反向数值排序,然后用于cut删除添加的字段:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '

天哪...我不知道$ RS!非常感谢你!!!!!
LanceBaynes

@forcefsck:我认为only不可能实现sort -kbegfieldGNU排序中的函数仅递减为零。我认为,您的装饰-排序-取消装饰(DSU)方法似乎是最好的方法。
Mikel

出于兴趣,为什么$NF,$RS不这样做$NF,$0?我不知道$RS那样做。(我想它等同于$NF,$"\n",功能相同,但是我认为这也很令人惊讶。)
Mikel

2
@ johnny8888,@ forcefsck:在awk中,$可以跟任何表达式。“ 未指定字段数表达式对除非负整数以外的任何值的影响 ”。GNU awk(在我的系统上)将字符串"\n"视为零。其他(例如,A,W和K的原始实现)因错误消息而中止。如果RS碰巧是一个数字,您将在任何实现上获得相应的字段。因此,请不要使用$0
吉尔(Gilles)'所以

1
真整洁!因此,这是怎么回事的长篇解释:使用awk,首先打印最后一个字段,然后打印整个记录,按相反的数字排序,然后使用cut修剪掉第一列。
phyatt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.