如果每列中的数据数量不相同,如何明智地求和?

如果每列中的数据数量不相同,如何明智地求和?

我正在使用这个 awk 脚本来计算每列的平均值。如果每列中的数据点相同,则该脚本工作正常。如果有人可以帮助我修改该脚本。
列中的数据点类似于(示例文件,但实际文件包含 10000 库仑):

1 3 4 5   
2 3 5 6  
5 4 5 6  
6 6 6  
7 7  
8   
{
    for(i=1; i<=NF; i++) {
        a[i]+=$i
        if($i!="")
            b[i]++}
    }
END {
    for(i=1; i<=NF; i++)
        printf "%s%s", a[i]/b[i], (i==NF?ORS:OFS)
}

答案1

您正在迭代NF,当您到达最后一个输入行时,它仅为 1。您需要迭代计算数组的长度。

另外查看您的空格分隔数据结构,您永远不会有空变量,因此也不需要if测试

awk '{
    for(i=1; i<=NF; i++) {
        a[i]+=$i; b[i]++
    }
END {
    for(i=1; i<=length(a); i++)      #<-----iterate over length(a) not NF
        printf "%s%s", a[i]/b[i], (i==length(a)?ORS:OFS)
}' file

根据 @kusalananda 评论,如果您的awk版本不支持以这种方式确定数组的长度,那么您将需要在输入期间找到最大字段数......

awk '{max = (max < NF) ? NF : max;
    for(i=1; i<=NF; i++) {
        a[i]+=$i; b[i]++}
    }
END {
    for(i=1; i<=max; i++)
        printf "%s%s", a[i]/b[i], (i==max?ORS:OFS)
}' file

相关内容