“使用 awk 对数字列表中的值进行分箱”提供了使用 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 行的平均值。
Using awkto 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
当调用$variableset 为 5 时,从样本数据生成的输出是:
2457135.565078 13.254065 13.144591 0.003624 0.003446
2457135.567486 13.270757 13.160853 0.003652 0.003472