接受的答案Using awk将值放入数字列表中 is:
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