如何使用awk聚合数据行

如何使用awk聚合数据行,awk,aggregate,Awk,Aggregate,我有一个问题,我有一组数据,其中一些行属于一个组 例如 问题是如何使用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 但这一次,我正在处理几个具有不同字段数的文件,我试图发出一个命令来自动计算

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

例如

问题是如何使用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
但这一次,我正在处理几个具有不同字段数的文件,我试图发出一个命令来自动计算组的平均值。 最终,我们将拥有

Apple 0.4 0.5 0.5
Orange 0.3 0.4 0.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

对gawk的引用是

以下是一个开始

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

关于gawk的参考是

你是如何得到Apple 0.4 0.5 0.5的?哎呀,应该是Apple 0.4 0.4 0.5打字错误。抱歉。您可以编辑您的问题。如何获得Apple 0.4 0.5 0.5?哎呀,应该是Apple 0.4 0.4 0.5打字错误。抱歉,您可以编辑您的问题。
$ ./shell.sh
Orange 0.3 0.4 0.5
Apple 0.4 0.4 0.5