1

私は awk の使用に非常に慣れていませんが、別のフィールド ($1) を共有する多くのレコードでフィールド ($3) の平均を計算する方法に関するこの質問に対する Fredrik Pihl の回答に多くの助けがありました。

質問: 行 (特定のフィールド) が一致する場合、列の 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

Fredrik Pihl の答え:

{
    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 を取得する必要があると思います。どうすればいいのかわからない。ヒントをありがとう。

4

3 に答える 3