【问题标题】:grep, sum and average from large output大输出的 grep、求和和平均值
【发布时间】:2018-09-08 14:43:53
【问题描述】:

我有一个名为 filename.mat0 的输出文件,其中包含大量不同时间步长的许多不同变量的数据点列表。我想使用类似 grep 命令来检索给定变量的所有实例,即 variable_A,然后将与 variable_A 关联的总值相加,然后取平均值。 时间步数是恒定的,因此 variable_A、variable_B 等都在我的 .mat 文件中出现 100 次。 请问你能建议最好的方法吗? 输出数据的一个例子是:

Timestep1 Variable_A 10
Timestep1 Variable_B 20 
Timestep1 Variable_C 30 

Timestep2 Variable_A 40 
Timestep2 Variable_B 50 
Timestep2 Variable_C 60

Timestep3 Variable_A 70 
Timestep3 Variable_B 80 
Timestep3 Variable_C 90

期望的输出:

Variable_A = 40

【问题讨论】:

  • 请为您的输出文件添加示例
  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 请点击您的问题下的edit,粘贴示例数据,然后用鼠标选中它并点击粗体旁边标有{}的按钮格式工具栏中的斜体
  • 谢谢,我已经把数据放到原来的问题里了
  • 不,你还没有 - 重新阅读 cmets 并查看 How to Ask

标签: grep sum average


【解决方案1】:

引用this

awk应该可以解决问题。查看链接了解如何使用awk。 下面的命令对你的情况应该没问题,但是如果有很多Variable,就不好用了。希望更熟悉awk的人能建议如何改进。

awk '{if ($2 == "Variable_A"){ total += $3; count++ }} END { print "Variable_A = " total/count }' sample.mat > avg_a.txt 

上述命令将对每一行执行,检查第 2 列(对应于$2)是否等于“Variable_A”,如果是,则将第 3 列中的值相加(对应于$3)并添加一个计数。处理完所有行后,将平均值打印到文本文件中。

更多问题

为了在同一个文件中显示多个变量的平均值,您可以在 AWK 中使用数组和 for 循环。将元素添加到 vars 以获得更多变量。

awk 'BEGIN {vars[0]="Variable_A"; vars[1]="Variable_B"; vars[2] ="Variable_C" } { for (i in vars) { if ($2 == vars[i]){ total[i] += $3; count[i]++ }}} END { for(i in vars) {print vars[i]" = " total[i]/count[i]}}' sample.mat > avg.txt

【讨论】:

  • 嗨,效果很好 - 谢谢。有什么办法可以修改它,以便如果我想记录多个数据平均值,我可以做到这一点,并且将 Variable_A 和 Varibale_B 都打印到同一个 avg.txt 文件中?
  • 我刚刚尝试了多个变量的命令,它返回错误“除以零尝试”。我不知道为什么
  • @smdr 我使用您提供的示例没有发现错误,您使用该命令执行的是什么文件?
猜你喜欢
  • 2023-03-31
  • 2016-12-29
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2015-09-29
  • 2015-09-24
相关资源
最近更新 更多