如何使用awk聚合数据行

1 awk aggregate

我有一个问题,我有一组行数据,其中一些行属于一个组。

例如

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
Run Code Online (Sandbox Code Playgroud)

问题是如何使用 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
Run Code Online (Sandbox Code Playgroud)

但这一次我正在处理多个具有不同 NF(字段数)的文件,并且我尝试发出一个命令来自动计算该组的平均值。最终,我们将拥有

Apple 0.4 0.5 0.5
Orange 0.3 0.4 0.5
Run Code Online (Sandbox Code Playgroud)

请指教。谢谢。

gho*_*g74 5

这是一个开始。

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
Run Code Online (Sandbox Code Playgroud)

输出

$ ./shell.sh
Orange 0.3 0.4 0.5
Apple 0.4 0.4 0.5
Run Code Online (Sandbox Code Playgroud)

对 gawk 的引用在这里