如所写:
awk'{for (i=1; i<=NF; i++)} rows=FNR;cols=NF} END
…
您会收到“命令未找到”错误,因为您必须在之间留一个空格awk
以及引号内的脚本。当你解决这个问题时,你就会开始遇到问题,因为有两个问题}
并且只有一个{
在脚本的第一行。
当您着手解决问题时,您将需要一个二维数组,按行号和列号索引,对文件中的值求和。您还需要知道已处理的文件数和列数。然后,您可以安排迭代 END 块中的二维数组。
awk 'FNR == 1 { nfiles++; ncols = NF }
{ for (i = 1; i < NF; i++) sum[FNR,i] += $i
if (FNR > maxnr) maxnr = FNR
}
END {
for (line = 1; line <= maxnr; line++)
{
for (col = 1; col < ncols; col++)
printf " %f", sum[line,col]/nfiles;
printf "\n"
}
}' ifile*.txt
鉴于问题中的三个数据文件:
ifile1.txt
3 5 2 2
1 4 2 1
4 6 5 2
5 5 7 1
ifile2.txt
1 2 1 3
1 3 0 2
2 5 5 1
0 0 1 1
ifile3.txt
4 3 4 1
5 3 1 5
3 4 3 1
4 3 4 0
我展示的脚本产生:
2.666667 3.333333 2.333333
2.333333 3.333333 1.000000
3.000000 5.000000 4.333333
3.000000 2.666667 4.000000
如果你想控制小数位数为2,那么使用%.2f
代替%f
.