我有这个输入:
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 等的平均脚本编写能力。
有人知道该怎么做吗?
答案1
以下命令行用于awk
添加 file.txt 每行的最后一个字段,进行反向数字排序,然后用于cut
删除添加的字段:
awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '
答案2
按数字降序对最后一列进行排序GNUawk:
awk '{
# save current row in array with current row number as index
row[NR]=$0
# save current last field in array with current row number as index
last[NR]=$NF
}
END{
# sort array "last" numerically ("num") based on its
# values ("val") descending ("desc")
PROCINFO["sorted_in"]="@val_num_desc";
for(i in last)
print row[i]
}' file
作为一行:
awk '{ row[NR]=$0; last[NR]=$NF } END{ PROCINFO["sorted_in"]="@val_num_desc"; for(i in last) print row[i] }' file
输出:
你好,我的名字是乔丹:476 你好,我的名字是马努:98 你好,我的名字是乔伊:45 你好,我的名字是 Loi:23 你好,我的名字是约翰:4
看8.1.6 使用 gawk 的预定义数组扫描顺序更多排序算法和8 个强大的 awk 内置变量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR