我有一个问题,我有一组行数据,其中一些行属于一个组。
例如
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)
请指教。谢谢。
这是一个开始。
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 的引用在这里