awk行(特定字段)匹配时列的平均部分

awk行(特定字段)匹配时列的平均部分,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 09

以下是我的输入文件示例:

$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
如果第一个字段匹配,我需要求第3列的平均值。很简单,但我很努力,因为我的awk知识是非常基础的。。。以下是我到目前为止的情况:

awk '{array[$1]+=$3(need to divide here by number of matches...)} END { for (i in array) {print i"," array[i]}}' NDVI-bm
通过搜索网络,我真的不确定我的方向是正确的。。。除非有一个简单的方法来计算比赛的数量,我似乎找不到。。。有什么想法吗


谢谢你的帮助

有一个不同的数组,用于跟踪每个索引看到的条目数,并在结束块中进行除法。

有一个不同的数组,用于跟踪每个索引看到的条目数,并在结束块中进行除法。

例如,计算以“P01”开头的行的平均数:

输出:

$ awk -f avg.awk input
avg = 0.4825
…或者,作为一个单行线:

$ awk '/^P01/{cnt+=$3; num+=1} END{print "avg="cnt/num}' input
或同时计算第一列的所有值:

{
    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]

}
产出:

$ awk -f avg.awk input
Name    sum     cnt     avg
P01     0.965   2       0.4825
P02     0.418   1       0.418
P03     1.039   2       0.5195
P04     2.481   4       0.62025
P05     0.748   1       0.748

例如,要计算以“P01”开头的行的平均值:

输出:

$ awk -f avg.awk input
avg = 0.4825
…或者,作为一个单行线:

$ awk '/^P01/{cnt+=$3; num+=1} END{print "avg="cnt/num}' input
或同时计算第一列的所有值:

{
    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]

}
产出:

$ awk -f avg.awk input
Name    sum     cnt     avg
P01     0.965   2       0.4825
P02     0.418   1       0.418
P03     1.039   2       0.5195
P04     2.481   4       0.62025
P05     0.748   1       0.748

谢谢你的回答,弗雷德里克,但我的档案很大。。。我无法逐一计算平均值。嘿,这是一个非常简单而优雅的解决方案。。。我在寻找一条通往复杂道路的路。。。我在学习!再次感谢!谢谢你的回答,弗雷德里克,但我的档案很大。。。我无法逐一计算平均值。嘿,这是一个非常简单而优雅的解决方案。。。我在寻找一条通往复杂道路的路。。。我在学习!再次感谢!