Awk每列中n个数据的平均值

Awk每列中n个数据的平均值,awk,average,Awk,Average,“”提供一个解决方案,使用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.0036

“”提供一个解决方案,使用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行的平均值。

可接受的答案是:

平均所有列的明显扩展是:

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
如果要分析输出格式,可以使代码更加复杂。我只是使用
%.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

不太清楚你的意思。您能将所需的输出与您的尝试粘贴在一起吗?anubhava在另一个问题中的脚本看起来很不错,也很容易使用。使用求和数组和
for(i=1;非常感谢你的回答。我用双引号和转义修改了你的示例
\$
\"
symbols,以便将awk代码嵌入bash脚本中,从而使
3
现在成为bash参数。使用:
awk-v N=$bash_var'…像以前一样编码…
-将变量传递到
awk
脚本中是一种更好的方法。当然,您应该删除BEGIN块。@leonardvertighel-不,绝对不要将脚本放入do中重复引用并开始转义
$
s和
s,这是完全错误的方法。按照乔纳森的建议去做,然后读一读阿诺德·罗宾斯的《有效的Awk编程》,第四版。@EdMorton非常感谢你的链接。我想@Jonathan在我的评论之后添加了
-v
部分。
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
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
2457135.565078 13.254065 13.144591 0.003624 0.003446
2457135.567486 13.270757 13.160853 0.003652 0.003472