【问题标题】:awk to find min and max of an arrayawk 查找数组的最小值和最大值
【发布时间】:2016-06-06 12:05:43
【问题描述】:

我有生成不同 ID 和计数的文件,如下所示

prod1 13
prod4 14
prod5 14
prod3 11
prod2 8
prod1 9
prod3 16
prod5 11
prod2 9
prod4 11
prod1 16
prod5 8
prod3 16
prod2 3
prod4 1
prod3 3
prod2 1
prod1 1
prod5 3
prod1 2
prod4 78

我正在尝试找到一个选项来获取每种产品的最大值和最小值。

运行以下 awk 脚本会给我计数和总和,但我还需要跟踪每个产品的最小值和最大值。

awk '{ Prod[$1]++; sum[$1]+=$2 } END{ for (var in Prod) print var, "count", Prod[var], "and sum", sum[var]}'

prod1 count 5 and sum 41
prod2 count 4 and sum 21
prod3 count 4 and sum 46
prod4 count 4 and sum 104
prod5 count 4 and sum 36

有没有办法修改 awk 数组脚本来获取最大值和最小值?

谢谢!

【问题讨论】:

    标签: arrays for-loop awk


    【解决方案1】:
      awk '{Prod[$1]++
        sum[$1]+=$2
        min[$1]=Prod[$1]==1||min[$1]>$2?$2:min[$1]
        max[$1]=max[$1]<$2?$2:max[$1]} 
        END{ for (var in Prod) printf "%s count %d and sum %d max %d min %d\n", var,Prod[var],sum[var],max[var],min[var]}' file
    

    给予

    prod4 count 4 and sum 104 max 78 min 1
    prod5 count 4 and sum 36 max 14 min 3
    prod1 count 5 and sum 41 max 16 min 1
    prod2 count 4 and sum 21 max 9 min 1
    prod3 count 4 and sum 46 max 16 min 3
    

    【讨论】:

    • 你能解释一下这条线是如何工作的吗? min[$1]=Prod[$1]==1||min[$1]&gt;$2?$2:min[$1] 我猜它相当于 min[$1]=(Prod[$1]==1||min[$1]&gt;$2?$2:min[$1]),但我仍然不明白 Prod[$1]==1 是如何工作的。非常感谢!
    • @manolius 是 min[$1]=booleanCHK?$2:min[$1] booleanCHK 是 Prod[$1]==1||min[$1]&gt;$2 如果我们将其翻译成英文,它将是:“如果产品是第一次出现或 Min(prod) 大于当前价值 ($2)"
    • 当然!我刚得到它。我初始化变量,这就是为什么我不需要“第一次出现”。你勇敢而自信地工作,没有括号操作员优先 :-) 这么多年了,谢谢你的回答
    • @manolius 如果我们编写生产代码,我会使用括号使其更易于阅读,甚至是 cmets,以说明它的作用。
    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 2021-09-15
    • 2018-05-03
    • 2014-06-11
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多