2013-07-03 34 views
1

我對使用awk非常陌生,但我在Fredrik Pihl的關於如何計算字段的平均值($ 3)的這個問題的答案中找到了很多幫助,在共享另一個字段($ 1)多條記錄:如果特定字段匹配的行的awk差異

問題:在awk列的平均一部分,如果線路(具體場)比賽

輸入樣本:

$cat NDVI-bm 
P01 031.RAW 0.516 0 0 
P01 021.RAW 0.449 0 0 
P02 045.RAW 0.418 0 0 
P03 062.RAW 0.570 0 0 
P03 064.RAW 0.469 0 0 
P04 083.RAW 0.636 0 0 
P04 081.RAW 0.592 0 0 
P04 082.RAW 0.605 0 0 
P04 084.RAW 0.648 0 0 
P05 093.RAW 0.748 0 0 

弗雷德裏克皮赫爾的回答是:

{ 
    sum[$1]+=$3 
    cnt[$1]++ 
} 


END { 
    print "Name" "\t" "sum" "\t" "cnt" "\t" "avg" 
    for (i in sum) 
     print i "\t" sum[i] "\t" cnt[i] "\t" sum[i]/cnt[i] 

} 

但是,我被卡住了也試圖計算匹配字段(每個值和平均值之間的差異的平方的總和除以計數)的方差。我想我可能需要一種方法來計算每個匹配記錄的END結構之前的平均值,或者如果可以在END結構中完成整個方差計算,但是我需要檢索原始值$ 3。我不知道該怎麼做。感謝任何提示。

+0

如果你發佈你想要的輸出將會有所幫助 –

+0

如果你捐贈的獎金可能會有所幫助。 – captcha

+0

@JS웃和parkydr:謝謝。 – KaH

回答

0

您可以通過計算樣本的總和和平方來計算最後的方差。

然後

variance = (Sum of squares - (Sum*Sum)/n)/n 

所以

{ 
    sum[$1]+=$3 
    sum_squares[$1]+=$3*$3 
    cnt[$1]++ 
} 


END { 
    print "Name" "\t" "sum" "\t" "cnt" "\t" "avg" "\t" "var" 
    for (i in sum) 
     print i "\t" sum[i] "\t" cnt[i] "\t" sum[i]/cnt[i] "\t" (sum_squares[i] - (sum[i]*sum[i])/cnt[i])/cnt[i] 

} 

爲了選擇特定的模式,將其添加到求和計算的開始(注END的文件的末尾匹配)例如

/P03/ { 
    sum[$1]+=$3 
    sum_squares[$1]+=$3*$3 
    cnt[$1]++ 
} 

現在只有線與它們P03將被處理

2

代碼GNU

{ 
    sum[$1]+=$3 
    count[$1]++ 
    groups[$3]=$1 
} 

END { 
    for (i in sum) mean[i]=sum[i]/count[i] 
    for (i in groups) meandiff[i]=i-mean[groups[i]] 
    for (i in groups) sumdiff2[groups[i]]+=meandiff[i]^2 
    for (i in sumdiff2) var[i]=sumdiff2[i]/count[i] 
    for (i in var) 
     print "group:", i, "count:", count[i], "\tmean:", mean[i], "\tsum:", sum[i], "\tsumdiff^2:", sumdiff2[i], "\t\tvariance:", var[i] 
} 

 
$cat file 
P01 031.RAW 0.516 0 0 
P01 021.RAW 0.449 0 0 
P02 045.RAW 0.418 0 0 
P03 062.RAW 0.570 0 0 
P03 064.RAW 0.469 0 0 
P04 083.RAW 0.636 0 0 
P04 081.RAW 0.592 0 0 
P04 082.RAW 0.605 0 0 
P04 084.RAW 0.648 0 0 
P05 093.RAW 0.748 0 0 

$awk -f prog.awk file 
group: P01 count: 2  mean: 0.4825 sum: 0.965  sumdiff^2: 0.0022445 variance: 0.00112225 
group: P02 count: 1  mean: 0.418  sum: 0.418  sumdiff^2: 0   variance: 0 
group: P03 count: 2  mean: 0.5195 sum: 1.039  sumdiff^2: 0.0051005 variance: 0.00255025 
group: P04 count: 4  mean: 0.62025 sum: 2.481  sumdiff^2: 0.00204875 variance: 0.000512188 
group: P05 count: 1  mean: 0.748  sum: 0.748  sumdiff^2: 0   variance: 0 
0

我認爲在你的awk腳本, 組[ $ 3] = $ 1 將無法​​正常工作,如果在第3列中有多個原始值相同,因爲這些N個相同的值只能在組中統計一次。

相關問題