2016-09-19 162 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 
相關問題