2010-01-19 21 views
1

我有一個問題,我有一組數據行中的某些行屬於一個組。如何使用awk來聚合數據行

E.g

Apple 0.4 0.5 0.6 
Orange 0.2 0.3 0.2 
Apple 0.4 0.3 0.4 
Orange 0.4 0.5 0.8 

的問題是我怎麼能相應地自動用awk聚集列。在過去,我會輕鬆地與手動以下awk的每個文件處理..

awk '{col2[$1]+=$2; col3[$1]+=$3; col4[$1]+=$4} END {for(i in col2){printf("%s\t%.2f\%.2f\t%.2f\n",i,col2[i]/2,col3[i]/2,col4[i]/2)}}' myfile 

但圍繞我處理不同的NF(場數)幾個文件這個時候,我嘗試發出命令來自動計算組的平均值。 最終,我們將有

Apple 0.4 0.5 0.5 
Orange 0.3 0.4 0.5 

請指教。謝謝。

+0

你怎麼得到蘋果0.4 0.5 0.5 ?? – ghostdog74 2010-01-19 06:34:18

+0

糟糕,應該是 Apple 0.4 0.4 0.5 錯字錯誤。道歉。 – joey 2010-01-19 06:40:49

+1

您可以編輯您的問題。 – 2010-01-19 14:21:02

回答

4

這裏有一些開始。

awk ' 
{ 
    fruits[$1]++ 
    for(o=2;o<=NF;o++){ 
     fruit[$1 SUBSEP o]=fruit[$1 SUBSEP o]+$o 
    } 
} 
END{ 
    for(combined in fruit){ 
     split(combined, sep, SUBSEP) 
     avg=fruit[ sep[1] SUBSEP sep[2] ]/fruits[ sep[1] ] 
     f[sep[1],sep[2]]=avg 
    } 
    for(fr in fruits) { 
     printf "%s ",fr 
     for(i=2;i<=NF;i++){ 
      printf "%s ",f[fr,i] 

     } 
     print "" 
    } 
}' file 

輸出

$ ./shell.sh 
Orange 0.3 0.4 0.5 
Apple 0.4 0.4 0.5 

參考呆子是here

1

最好的實用介紹,到目前爲止,我發現。

AWK by Example

它應該給你一個基本的瞭解,在大約一個小時。