【问题标题】:AWK to average over columns from multiple filesAWK 对来自多个文件的列进行平均
【发布时间】:2014-06-06 21:25:30
【问题描述】:

我有多个类似的文件,例如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 命令?

【问题讨论】:

  • 编辑您的问题以显示您的问题的示例数据。我们应该只需要查看 2-3 行数据,每行 5-7 个字段。然后包括该输入的预期输出。祝你好运。
  • 您有少于 7 列的文件吗?
  • 为什么不{sum+=$7;}END{print sum/NR} ...加上任何你需要考虑的格式和空白或无用的数据行...如果没有细节就不能走得更远。
  • 我在编辑的问题中添加了示例计算。谢谢

标签: awk


【解决方案1】:

如果要获取每个文件中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 的ARGC

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

【讨论】:

  • OP 声明:“我想对所有文件的第 7 列的每一行进行平均”,因此它将对同一行的文件进行平均。跨度>
  • @PM77-1 那么我的第二个 awk cmd 应该这样做,对吗?它输出单行,这是所有文件中col7的平均值。
  • 不。他/她想要 45120 个平均值。每行一个(不是每个文件)。
  • 是的,这是我的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多