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