【问题标题】:Calculate minimum and maximum value in the same rows usign awk使用 awk 计算同一行中的最小值和最大值
【发布时间】:2017-01-27 05:19:54
【问题描述】:

我有数据集的样子:

A 10
A 12
A 13
B 10
B 25
B 66
B 80
C 2
C 3

我能够使用 AWK 平均值计算相同行的平均值(使用数组)。我想将最小值和最大值添加到我的脚本中。有什么想法吗?

我的脚本:

awk -v OFS="\t" '{v[$1]+=$2; n[$1]++}END {for (l in n) {print l "\t" v[l] / n[l]}}' > out.txt

感谢您的任何建议。

【问题讨论】:

  • 同一列?该行中只有一个元素。
  • 只需添加更多数组,例如avg[]min[]max[]
  • 是的,在同一列。如果只有一个值,只需为最小值和最大值打印相同的值。可以说 - D 10 ---> min=10, max=10..

标签: bash awk max average min


【解决方案1】:

一种方法可能是再创建 2 个数组:一个用于最大值,另一个用于最小值。

【讨论】:

  • 是的,我仍在尝试弄清楚如何为最小值和最大值添加数组..仍然有一些错误......
  • @Geroge 如果你展示你在那里所做的尝试和你得到的错误,这个问题会好得多
【解决方案2】:

扩展您的代码:

$ cat foo.awk
{
    v[$1]+=$2 
    n[$1]++
    if(min[$1]>$2||min[$1]=="") 
        min[$1]=$2
    if(max[$1]<$2) 
        max[$1]=$2 
}
END {
    for (l in n) 
        print l, v[l] / n[l], min[l], max[l] 
}
$ awk -v OFS="\t" -f foo.awk foo.txt
A       11.6667 10      13
B       45.25   10      80
C       2.5     2       3

【讨论】:

    【解决方案3】:

    这段代码应该很容易阅读

    $ awk       '{k=$1; v=$2; sum[k]+=v; count[k]++} 
      !(k in min){min[k]=max[k]=v} 
         min[k]>v{min[k]=v} 
         max[k]<v{max[k]=v} 
              END{for(k in sum) print k,min[k],max[k],sum[k]/count[k]}' file |
      column -t
    
    A  10  13  11.6667
    B  10  80  45.25
    C  2   3   2.5
    

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多