我有一个名为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
答案 0 :(得分:0)
引用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