bash:从数据集计算RMSD

问题描述

我有一个包含 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)