使用 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 个字段中的哪个数字进行排序。无论哪种情况,这里都有两种解决方案。如果您还有其他问题,请告诉我。
我有一个包含名称和数字的文件,例如: 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 个字段中的哪个数字进行排序。无论哪种情况,这里都有两种解决方案。如果您还有其他问题,请告诉我。