AWK对多个文件中的列进行平均

时间:2014-06-06 21:25:30

标签: awk

我有类似的多个文件,例如c1.txt,c2.txt ....等我希望平均所有文件的第7列的每一行,并将输出写入另一个文件。每个文件有45120行或行。为了计算我写的第7列的总和:

awk '{a[FNR]+=$7;b[FNR]++;}END{for(i=1;i<=FNR;i++)print a[i]/b[i];}' c* > ave_result.txt

然后打印出第7列每行平均值的一半,它只打印到第264行。我检查了第264行的输出,它甚至没有打印那些文件的平均值的一半。

如何修改awk命令以计算第7列中每行的正确平均值?谢谢。 例如,第一个文件的几行是

1 1 1 1 1 1 2.559346e-08 2.080054e-10
1 1 1 1 1 2 1.398551e-09 2.709745e-09
1 1 1 1 1 3 -7.939651e-10 -1.560374e-09

和第二个文件中的类似内容:

2 1 1 1 1 1 2.579924e-08 2.756949e-09
2 1 1 1 1 2 -1.333798e-10 1.700513e-09
2 1 1 1 1 3 2.334223e-09 -3.592740e-09

然后开启。我想计算我所有文件的第7列的平均值。所以预期的产出是

2.579924e-08
6.3259e-10
6.3259e-10

现在如果我有200个这样的文件并且每个文件有45120行,如何编辑awk命令?

1 个答案:

答案 0 :(得分:3)

如果您想获得每个文件中col7的平均值:

您将a[] and b[]设置为一个文件,但在开始处理新文件时您没有清除它们。所以结果不会是正确的。实际上,此问题不需要数组。你可以尝试一下(我没有测试过):

awk 'FNR==1{if(s!=0)print s/c; s=0;c=0}{s+=$7;c++}END{print s/c}' c* > result.txt

如果您想从所有文件获得col7的平均值:

awk '{s+=$7}END{print s/NR}' c* > result.txt

修改

@ PM77-1评论说,我可能不理解您的要求。如果你想要45120输出线,就像

sum $7 of all line 1 from all files, and get average, output line 1
sum $7 of all line 2 from all files, and get average, output line 2
...
sum $7 of all line 45120 from all files, and get average, output line 45120

您实际上并不需要b[]。您可以使用计数器来计算文件数量或使用gawk&#39; s ARGC

awk '{a[FNR]+=$7}END{for(i=1;i<=FNR;i++)print a[i]/(ARGC-1);}' c* >...