AWK:按照从列中获得的结果的排序顺序打印文件数据

AWK : To print data of a file in sorted order of result obtained from columns

我有一个看起来有点像这样的输入文件:

PlayerId,Name,Score1,Score2
1,A,40,20
2,B,30,10
3,C,25,28

我想编写一个 awk 命令来检查得分总和大于 50 的玩家,并按总得分的排序顺序输出 PlayerId 和 PlayerName。

当我尝试以下操作时:

awk 'BEGIN{FS=",";}{=+;if(>50) print ,}' | sort -k5

它不起作用,似乎是根据它们的 id 对它们进行排序。

1 A
3 C

而我期望的正确输出是:(因为玩家 A 的总分 = 60,而 C 的总分 = 53,我们希望输出按升序排序)

3 C
1 A

除此之外,让我有点困惑的是,当我尝试根据分数 1 对其进行排序时,即第 3 列,但打算只打印相应的 ID 和名称,它也不起作用。

awk 'BEGIN{FS=",";}{=+;if(>50) print ,}' | sort -k3

并输出:

1 A
3 C

但是,如果关于正在排序的数据的 $3 包含在打印中,

awk 'BEGIN{FS=",";}{=+;if(>50)print ,,}' | sort -k3

它产生正确的输出(但在显示中包含不需要的 score1 参数)

3 C 25
1 A 40

但是如果只想打印 id 和 name 字段怎么办?

实际上我是 awk 命令的新手,可能我没有正确使用 sort 命令。如果有人能解释一下,那将非常有帮助。

如果你外包排序,你需要有辅助值并且需要稍后将其删除,一些复杂的是由于保留header。

 $ awk -F, 'NR==1 {print s "\t"  FS ; next}
     (s=+)>50 {print s "\t"  FS  | "sort -n" }' file | cut -f2

PlayerId,Name
3,C
1,A

我想这就是你想要做的:

$ awk 'BEGIN{FS=","} {sum=+} sum>50{print sum,,}' file |
    sort -k1,1n | cut -d' ' -f2-
3 C
1 A

您必须打印总和以便对其进行排序,然后 cut 将其删除。

如果您也想要 header 输出,那么它将是:

$ awk 'BEGIN{FS=","} {sum=+} (NR==1) || (sum>50){print (NR>1),sum,,}' file |
    sort -k1,2n | cut -d' ' -f3-
PlayerId Name
3 C
1 A