" Using awk to bin values in a list of numbers"提供一个解决方案,使用awk平均每列3个点。
如何将它扩展到保留格式的无限数量的列?例如:
2457135.564106 13.249116 13.140903 0.003615 0.003440
2457135.564604 13.250833 13.139971 0.003619 0.003438
2457135.565067 13.247932 13.135975 0.003614 0.003432
2457135.565576 13.256441 13.146996 0.003628 0.003449
2457135.566039 13.266003 13.159108 0.003644 0.003469
2457135.566514 13.271724 13.163555 0.003654 0.003476
2457135.567011 13.276248 13.166179 0.003661 0.003480
2457135.567474 13.274198 13.165396 0.003658 0.003479
2457135.567983 13.267855 13.156620 0.003647 0.003465
2457135.568446 13.263761 13.152515 0.003640 0.003458
每5行平均值,应输出类似
的内容2457135.564916 13.253240 13.143976 0.003622 0.003444
2457135.567324 13.270918 13.161303 0.003652 0.003472
其中第一个结果是前1-5行的平均值,第二个结果是6-10行的平均值。
答案 0 :(得分:4)
Using awk
to bin values in a list of numbers的接受答案是:
awk '{sum+=$1} NR%3==0 {print sum/3; sum=0}' inFile
平均所有列的明显扩展是:
awk 'BEGIN { N = 3 }
{ for (i = 1; i <= NF; i++) sum[i] += $i }
NR % N == 0 { for (i = 1; i <= NF; i++)
{
printf("%.6f%s", sum[i]/N, (i == NF) ? "\n" : " ")
sum[i] = 0
}
}' inFile
这里的额外灵活性是,如果要对5行的块进行分组,只需将3次出现的值更改为5.这将忽略文件末尾最多N-1行的块。如果需要,可以添加一个END块,如果NR%N!= 0,则可以打印一个合适的平均值。
对于样本输入数据,我从上面的脚本得到的输出是:
2457135.564592 13.249294 13.138950 0.003616 0.003437
2457135.566043 13.264723 13.156553 0.003642 0.003465
2457135.567489 13.272767 13.162732 0.003655 0.003475
如果要分析输出格式应该是什么,可以使代码更复杂。我只是使用%.6f
来确保6个小数位。
如果您希望N成为命令行参数,可以使用-v
选项将变量设置转发到awk
:
awk -v N="${variable:-3}" \
'{ for (i = 1; i <= NF; i++) sum[i] += $i }
NR % N == 0 { for (i = 1; i <= NF; i++)
{
printf("%.6f%s", sum[i]/N, (i == NF) ? "\n" : " ")
sum[i] = 0
}
}' inFile
在$variable
设置为5的情况下调用时,样本数据生成的输出为:
2457135.565078 13.254065 13.144591 0.003624 0.003446
2457135.567486 13.270757 13.160853 0.003652 0.003472