【发布时间】:2020-11-22 04:34:50
【问题描述】:
我有一个看起来有点像这样的输入文件:
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
而我期望的正确输出是:(因为玩家 A 的总分=60,C 的总分=53,我们希望输出按升序排序)
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
它产生正确的输出(但在显示中包含不需要的 score1 参数)
3 C 25
1 A 40
但是如果只想打印 id 和 name 字段呢?
实际上我是 awk 命令的新手,可能我没有正确使用 sort 命令。如果有人能解释一下,那将非常有帮助。
【问题讨论】:
-
欢迎来到 SO,您能否在您的问题中发布确切的示例输出,然后让我们知道。顺便说一句,特别感谢您在问题中以代码形式添加您的努力。
-
您的第一个命令是打印 2 个字段 (
print $1,$2) 并要求sort对第 5 个字段 (sort -k5) 进行排序。您的 awk 脚本为第 5 个字段分配了一个值,但您不打印它。 -
是的,@EdMorton,那么这是否意味着在 awk 中,每当我们对字段进行排序时,它必须包含在打印语句中?...但是如果我不打算打印该字段怎么办?
-
您正在混合使用 2 种完全不同的工具 - awk 和 shell。 shell 调用
awk,然后同一个shell 在awk 的输出上调用sort。对于sort对字段进行排序,该字段必须存在于其输入中。鉴于此,awk必须输出一个字段供sort进行排序。如果您不想在最终输出中看到该字段,那么您需要在使用它完成sort后再次将其删除,方法是将sorts 输出传递到一些其他工具,例如cut或sed或第二次致电awk。
标签: bash sorting unix awk logic