首页 > 解决方案 > 如何使用awk计算偏差方程

问题描述

我有一个数学方程,其中我必须使用文件的第一列来计算平均绝对偏差,我被困在尝试使用 awk 来计算它

这是等式:

其中α对应于文件第一列的值test.2(如下所示),n是文件的行数(不包括第一行)。

该文件看起来像这样

 79
  1    4.4278   2.2139   2.1869   3.0000   0.0000   0.0000   0.0000
  2    6.9588   3.4794   2.9968   5.0000   0.0000   0.0000   0.0000
  3    6.5200   3.7258   2.8564   2.0000   1.0000   0.0000   0.0000
  4    6.4927   3.7101   2.8477   2.5000   1.0000   0.0000   0.0000
  5    6.2338   3.5621   2.7648   2.5000   1.0000   0.0000   0.0000
  6    6.1514   3.5150   2.7384   2.5000   1.0000   0.0000   0.0000
  7    6.5048   3.7171   2.8515   2.5000   1.0000   0.0000   0.0000
  8    6.6012   3.7722   2.8824   2.5000   1.0000   0.0000   0.0000

值一直持续到达到 79 行。第一个值是n我尝试使用的行数

n = awk ‘NR == 1 {print $1}’ test.2

但我不知道如何计算αtest.2 文件中的所有值,然后计算总和。

到目前为止我唯一测试的是

for i in $(seq 1 "${n}"); do
        i=$((i+1))
        a=awk 'NR == $i {print $2}' test.2
        x=$(awk -F'[-,]' '({print sqrt((a[{$i}]-2a[${i}+1]+a[${i}+2])ˆ2)}')
        stdev=$x/(n-2)
done

echo "$stdev"

标签: shellawk

解决方案


大体上应该是这样的,但是需要自己去测试改正。

awk '                                    
NR == 1 { n = $1 }                       
NR > 1 {                                 
 a[0] = a[1];                            
 a[1] = a[2];                            
 a[2] = $2;                              
 if (NR > 3) {                           
   row_value = ( a[0] - 2 * a[1] + a[2] )
   if (row_value < 0) {                  
     row_value = - row_value             
   }                                     
   sum += row_value                      
 }                                       
}                                        
END { print sum / (n - 2) }' test.2

推荐阅读