calc由n行组成

时间:2012-02-24 12:41:35

标签: linux bash shell awk

我需要将所有列的平均值计算为三行,例如

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

有人可以给我一个简单的脚本吗?

2 个答案:

答案 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