繁体   English   中英

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=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k5

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

1 A
3 C

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

3 C
1 A

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

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50) print $1,$2}' | sort -k3

并输出:

1 A
3 C

但是,如果打印中包含与正在排序的数据相关的 3 美元,

awk 'BEGIN{FS=",";}{$5=$3+$4;if($5>50)print $1,$2,$3}' | sort -k3

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

3 C 25
1 A 40

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

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

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

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

PlayerId,Name
3,C
1,A

我认为这就是你想要做的:

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

您必须打印总和,以便您可以按它排序,然后cut将其删除。

如果你也想要 header output 那么它会是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM