我需要将所有列的平均值计算为三行,例如
0.9 0.7 4.1 12.0
0.9 0.7 4.1 12.5
0.8 0.7 4.1 12.4
0.7 0.3 4.1 11.2
0.7 0.3 4.1 11.2
0.8 0.3 4.0 11.1
所以我应该只获得两行,即
0.86 0.7 4.1 12.3
0.73 0.3 4.03 11.16
有人可以给我一个简单的脚本吗?
答案 0 :(得分:1)
here is an awk script for you dear.
BEGIN{
FS=" ";
N=3;
sum1=0;sum2=0;sum3=0;sum4=0;count=1;
}
{
if(count%N != 0 )
{
count++;
sum1 = sum1 + $1;
sum2 = sum2 + $2;
sum3 = sum3 + $3;
sum4 = sum4 + $4;
}
else
{
sum1 = sum1 + $1;
sum2 = sum2 + $2;
sum3 = sum3 + $3;
sum4 = sum4 + $4;
printf("%f %f %f %f\n",sum1/N,sum2/N,sum3/N,sum4/N);
sum1=0;sum2=0;sum3=0;sum4=0;count=1;
}
}
END{
}
希望它会对你有所帮助。运行它:
awk -f <name of this awk script> <your input text file>
因为,如果你的文本文件包含x行输入,其中x不是N的多个,那么你的x%N行将会从你的输出中遗漏。上面的脚本将给出部分结果但正确的文本文件中的行数不是N的倍数。要处理这个,你可以在脚本的END部分添加以下行。
END{
count-=1;
if(count!=0)
{
printf("Last 'x'=%d lines in the text file such that x < N\n",count);
printf("%f %f %f %f\n",sum1/count,sum2/count,sum3/count,sum4/count);
}
}
答案 1 :(得分:0)
这可能适合你:( GNU awk?)
awk -vCONVFMT='%2.2f' '{a+=$1;b+=$2;c+=$3;d+=$4}!(NR%3){$1=a/3;$2=b/3;$3=c/3;$4=d/3;a=b=c=d=0;print}' file
0.87 0.70 4.10 12.30
0.73 0.30 4.07 11.17