Shell 如何利用awk计算偏差方程

Shell 如何利用awk计算偏差方程,shell,awk,Shell,Awk,我有一个数学方程,其中我必须使用文件的第一列来计算平均绝对偏差,我一直在尝试使用awk来计算它 其中,α对应于测试.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.52

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

其中,
α
对应于
测试.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"

大致应该是这样,但您需要进行测试和更正

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
awk'
NR==1{n=$1}
NR>1{
a[0]=a[1];
a[1]=a[2];
a[2]=2元;
如果(NR>3){
行_值=(a[0]-2*a[1]+a[2])
如果(行_值<0){
行值=-行值
}                                     
总和+=行值
}                                       
}                                        
结束{打印和/(n-2)}测试

我不明白这个逻辑。它正在打印多个值,如果我没有弄错的话,它应该只打印一个值。因为,根据公式,你要对前三个值求和,然后,从第二个值开始,计算下三个值,依此类推,直到你更新了所有的值,但正如我说的,你可以解决任何问题。我只想展示你应该如何在awk中处理这个问题。我也漏掉了绝对值部分。我理解,谢谢。对于绝对部分,我不应该只添加一个
sqrt
和一个
ˆ2
吗?这是个好主意。是的,你也可以编写一个abs函数。我理解大部分代码,只有
a[0]=a[1]
a[1]=a[2]
我不理解