[英]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.