2016-09-19 93 views
-1

我有数据组相同的行看起来:计算最大值和最小值在usign AWK

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 

谢谢你的任何建议。

+0

同列?行中只有一个元素。 – Inian

+2

只需添加更多数组,例如'avg []','min []'和'max []'。 –

+0

是在同一列。如果只有一个值只是打印最小值和最大值的相同值。可以说 - D 10 ---> min = 10,max = 10 .. – Geroge

回答

2

这段代码应该是微不足道的读取

$ 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 
0

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

+0

是的,我仍然试图找出如何添加数组的最小和最大..仍然有一些错误... – Geroge

+0

@Geroge这个问题会如果你展示了你在那里所做的尝试以及你得到的错误,那会好很多 –

1

扩展代码:

$ 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