2015-05-20 104 views
1

Using awk to bin values in a list of numbers”提供了一个解决方案,使用awk对列中每个3点的平均值进行平均。awk每列中n个数据的平均值

如何将它扩展为无限数量的列来支持格式?例如:

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行。

+2

不太清楚你的意思。你可以粘贴所需的输出与你的尝试?在另一个问题中,anubhava的脚本看起来相当不错并且易于使用 – fedorqui

+2

使用一个和数组和'for(i = 1; i <= NF; i ++)'循环来控制求和。对于打印,您必须确定您感兴趣的原始格式的保真度级别以及如何确定该格式。例如,如果值在99999.95和100000.05之间移动,会发生什么情况?你只是使用6位小数的空格分隔数字吗?如果是这样,那很容易。如果您需要确保小数点前的7,2,2,1,1位数字,即使数字之前只有5,1,1,1,1位数字,您也必须加倍努力。 –

回答

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 
+0

非常感谢您的回答。为了将你的awk代码嵌入到bash脚本中,我使用双引号和转义'\ $'和'\“'符号修改了你的例子,现在'3'是一个bash参数。 –

+2

用法:'awk -v N = $ bash_var'...代码像以前一样...'' - 将变量传递到'awk'脚本是一种更好的方法。当然,你会丢弃BEGIN块。 –

+2

@leonardvertighel - 不,绝对不要把脚本放入双引号并开始转义'$'s和'“,这完全是错误的方法。按照乔纳森的建议,阅读http://cfajohnson.com/shell/cus-faq-2.html#Q24并获得Arnold Robbins编写的“有效的Awk编程”第4版。 –