【问题标题】:AWK : To print data of a file in sorted order of result obtained from columnsAWK:以从列中获得的结果的排序顺序打印文件的数据
【发布时间】: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 输出传递到一些其他工具,例如 cutsed 或第二次致电awk

标签: bash sorting unix awk logic


【解决方案1】:

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

 $ 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

【讨论】:

    【解决方案2】:

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

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

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

    如果你也想要标题输出,那么它会是:

    $ 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
    

    【讨论】:

    • 非常感谢@Ed Morton...只有一个问题,当我们说 sort -n 时,我知道我们要进行数字排序,所以每当我们不使用指定字段编号时-k5 或 -k3 什么的,那么这意味着我们正在按数字变量排序(在这种情况下是 sum ?)...是这样吗?
    • 不完全是,默认情况下sort 从行的第一个字符开始按整行排序。在这种情况下,-n 只是说“对行进行数字排序”,因为第一个字段是我们关心的数字,这就足够了。我将答案更新为仅按第一个字段排序,这样更简洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多