计算风速变化的awk程序

计算风速变化的awk程序,awk,gawk,Awk,Gawk,我已将以下文件格式化为如下所示的格式- DATA THROUGH 2001 YRS JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ANN BIRMINGHAM AL 58 8.1 8.7 9.0 8.2 6.8 6.0 5.7 5.4 6.3 6.2 7.2 7.7 7.1 HUNTSVILLE AL 34 9.1 9.4 9.8 9.2 7.9 6.9 6.1 5.8 6.7 7.3 8.1 9.0 7.9 MOBILE AL

我已将以下文件格式化为如下所示的格式-

 DATA THROUGH 2001  YRS JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ANN
BIRMINGHAM  AL  58  8.1 8.7 9.0 8.2 6.8 6.0 5.7 5.4 6.3 6.2 7.2 7.7 7.1
HUNTSVILLE  AL  34  9.1 9.4 9.8 9.2 7.9 6.9 6.1 5.8 6.7 7.3 8.1 9.0 7.9
MOBILE  AL  53  10.1    10.3    10.7    10.1    8.7 7.5 6.9 6.7 7.7 8.0 8.9 9.6 8.8
MONTGOMERY  AL  57  7.7 8.2 8.3 7.3 6.1 5.8 5.7 5.2 5.9 5.7 6.5 7.1 6.6
ANCHORAGE   AK  48  6.4 6.8 7.1 7.3 8.5 8.4 7.3 6.9 6.7 6.7 6.4 6.3 7.1
ANNETTE AK  37  11.7    11.9    10.6    10.7    9.0 8.5 7.8 8.1 8.9 11.4    11.8    12.0    10.2
BARROW  AK  68  11.9    11.3    11.3    11.5    12.0    11.5    11.7    12.4    13.2    13.3    12.4    11.7    12.0
BARTER IS.  AK  33  15.1    14.4    13.7    12.0    12.7    11.6    10.9    11.8    13.2    14.8    14.9    13.9    13.2
BETHEL  AK  43  14.5    14.8    13.8    12.9    11.5    11.0    10.7    11.0    11.6    12.3    13.2    13.7    12.6
BETTLES AK  26  5.9 6.3 7.1 7.5 7.2 6.8 6.6 6.2 6.4 6.4 5.8 5.7 6.5
我需要计算每个州的方差,除了由AK表示的阿拉斯加。 方差公式为:nƩ(x^2)-(x^2)/n(n-1)

我现在只有一些类似于

    BEGIN {FS ="\t"} {if ($2 != "AK")
{
        sum1 = sum1 + ($4)^2
        sum2 = sum2 + $4
        n = n+1
        if($2 != "AK")
        {
                sum1 = sum1 * n;
                sum3 = sum1 - (sum2)^2
                sum3 = sum3 / (n*(n-1));
        }


}} END {}

BEGIN {FS ="\t"} {if ($2 != "AK")
{

           sum1 = sum1 * n;
           sum3 = sum1 - (sum2)^2
           sum3 = sum3 / (n*(n-1));

}}

END {print "average " sum3}
我得到一个零误差除法


我对如何计算这个公式缺乏想法。任何关于分解代码的建议-寻找模式和/或完整的代码将不胜感激

当状态为非AK时,这将对第10列的平方进行求和。然后使用你的公式

BEGIN {
    FS = "\t";
    n = 0;
}
{
    if($2 != "AK") {
        x[n] = $10 * $10;
        n++;
    }
}

END {
    sum = 0;
    for(i = 0; i < n; i++)
        sum += x[i];
    print (n*sum - sum) / (n * (n-1));
}
开始{
FS=“\t”;
n=0;
}
{
如果($2!=“AK”){
x[n]=$10*$10;
n++;
}
}
结束{
总和=0;
对于(i=0;i
当状态为非AK时,对第10列的平方进行求和。然后使用你的公式

BEGIN {
    FS = "\t";
    n = 0;
}
{
    if($2 != "AK") {
        x[n] = $10 * $10;
        n++;
    }
}

END {
    sum = 0;
    for(i = 0; i < n; i++)
        sum += x[i];
    print (n*sum - sum) / (n * (n-1));
}
开始{
FS=“\t”;
n=0;
}
{
如果($2!=“AK”){
x[n]=$10*$10;
n++;
}
}
结束{
总和=0;
对于(i=0;i
列数是固定的还是可变的?为什么要用awk来计算?我不明白你想计算什么。你能解释清楚一点吗?你想要每个城市一年内的差异吗?你想要一年中某个州每个城市的平均方差吗?你想知道某个州每个月的方差吗?@Jay-我想对6月1日的所有记录风速进行方差样本分析(ANOVA)-除阿拉斯加(AK)外的所有州--标准公式计算平均偏差的平方和除以n-1,其中n是样本数。您的代码被复制,在第二个版本中,
n
从不增加,因此它始终为0。列数是固定的还是可变的?为什么要使用awk?我不明白您想做什么算计。你能解释清楚一点吗?你想要每个城市一年内的差异吗?你想要一年中某个州每个城市的平均方差吗?你想知道某个州每个月的方差吗?@Jay-我想对6月1日的所有记录风速进行方差样本分析(ANOVA)-除阿拉斯加(AK)外的所有州-标准公式计算平均偏差的平方和除以n-1,其中n是重复代码的样本数,在第二个版本中,
n
从不递增,因此始终为0。