使用 awk 并在 Linux 中按降序对最后一列进行排序

Using awk and sort last column in descending order in Linux

我有一个包含名称和数字的文件,例如: data.csv

2016,Bmw,M2,2 Total score:24

1998,Subaru,Legacy,23 Total score:62

2012,Volkswagen,Golf,59 Total score:28

2001,Dodge,Viper,42 Total score:8

2014,Honda,Accord,83 Total score:112

2015,Chevy,Camaro,0 Total score:0

2008,Honda,Accord,88 Total score:48

总分是我做的最后一栏:

awk -F","  'NR>1{{for(i=4;i<=6;++i)printf $i""FS }
                                         {sum=0; for(g=8;g<=NF;g++)
                                         sum+=$g
                                         print $i,"Total score:"sum ; print ""}}' data.csv

当我尝试时

 awk -F","  'NR>1{{for(i=4;i<=6;++i)printf $i""FS }
                                          {sum=0; for(g=8;g<=NF;g++)
                                         sum+=$g
                                          print $i,"Total score:"sum ; print "" | "sort -k1,2n"}}' data.csv

报错,我只想对总分列进行排序,请问是我哪里做错了吗?感谢任何帮助

首先,假设data.csv中每行数据之间确实没有空行,你只需要sort,你根本不需要awk。例如,由于要降序排序的总分前只有':',则可以使用:

sort -t: -k2,2rn data.csv

其中 -t: 告诉排序使用 ':' 作为字段分隔符,然后 KEYDEF -k2,2rn 告诉排序使用第二个字段(':' 之后的内容排序依据),rn 表示在该字段上使用 反向数字 排序。

例子Use/Output

使用 data.csv 中的数据(没有空行),您将:

$ sort -t: -k2,2rn data.csv
2014,Honda,Accord,83 Total score:112
1998,Subaru,Legacy,23 Total score:62
2008,Honda,Accord,88 Total score:48
2012,Volkswagen,Golf,59 Total score:28
2016,Bmw,M2,2 Total score:24
2001,Dodge,Viper,42 Total score:8
2015,Chevy,Camaro,0 Total score:0

您按 Total score 降序排列的是哪个。如果你想要升序,只需从 -k2,2rn.

中删除 r

如果确实有空行,可以在使用 sed -i '/^$/d' data.csv 排序之前将其删除。

按“总分”前的数字排序

如果您想按 XX Total score: yy 字段开头的数字排序(例如 XX),您可以使用字段分隔符为 ',' 的排序,然后使用 KEYDEF将是 -k4.1,4.3rn,它只是说使用第 4 个字段字符 1 到字符 3 按相同的 反向数字 进行排序,例如

sort -t, -k4.1,4.3rn data.csv

例子Use/Output

在这种情况下,按 Total score 之前的数字降序排序将导致:

$ sort -t, -k4.1,4.3rn data.csv
2008,Honda,Accord,88 Total score:48
2014,Honda,Accord,83 Total score:112
2012,Volkswagen,Golf,59 Total score:28
2001,Dodge,Viper,42 Total score:8
1998,Subaru,Legacy,23 Total score:62
2016,Bmw,M2,2 Total score:24
2015,Chevy,Camaro,0 Total score:0

发布原始解决方案后,我注意到它不明确,因为您打算对第 4 个字段中的哪个数字进行排序。无论哪种情况,这里都有两种解决方案。如果您还有其他问题,请告诉我。