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
我有一个看起来有点像这样的输入文件:
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