问题描述
我有一个包含 240 行的 my_file.xvg,其中的数字按以下格式排列:
5.4
5.1
5.2
5.4
5.4
4.9
5.0
5.2
....
4.9
我已经使用 awk 计算了这些数据的平均值并将其存储为 bash 脚本中的“平均值”变量:
mean=$(awk '{sum+=$1}END{printf "%.1f",sum/NR}' my_file.xvg)
我如何计算这些数字的 RMSD(例如确定平均值的误差)并将其存储为另一个变量?
解决方法
无需运行两次awk
脚本,一次即可计算统计数据
$ read -r mean std < <(awk '{s+=$1;ss+=$1^2} END{printf "%.2f %.2f",m=s/NR,sqrt(ss/NR-m^2)}' file)
$ echo $mean $std
5.20 0.18
,
一旦将均值保存在变量中,就可以对 RMSD 使用非常相似的方法。由于您似乎更喜欢 awk,请参阅以下内容:
rmsd=$(awk -v mean=$mean '{++n;sum+=($NF-mean)^2} END{if(n) print sqrt(sum/n)}' my_file.xvg)