如何在select范围内进行两次运算?

How to select range for two operations?

我想计算 60000 个数据集的平均值和标准差(因此 NR=60000)。我的数据集文件有两列,我关心的是第 2 列。我想使用 "awk" 来完成这项工作。脚本如下:

awk '   { sum+=; array[NR]= }
        END {for(x=10000;x<=NR;x++) {sumsq+=((array[x]-(sum/NR))^2);} 
        printf("%8.3f\t%8.3f\n"), (sum/NR), sqrt(sumsq/NR)  }' < $fileIn

我希望代码仅选择从 10000 到 60000 的范围来计算平均值和标准偏差。

对于标准差,代码选择 10000 到 60000 的范围,但对于平均值,它使用 1-60000 的范围。

如何为这两个计算选择 10000-60000 的范围?

提前致谢。

我认为您必须使用 NR 变量限制要计算的行。对于结果,我不喜欢数学,但你不应该选择文件的整个长度(NR),而是用于计算的行的长度(length(array)),所以它会结果如:

awk '   
 NR >= 10000 { sum+=; array[NR]= }
 END {
    total = length(array); 
    for(x=10000;x<=NR;x++) {sumsq+=((array[x]-(sum/total))^2);} 
    printf("%8.3f\t%8.3f\n"), (sum/total), sqrt(sumsq/total)  
 }'

我不确定数学(希望你给出了一个小的可测试示例,比如 10 行!)但听起来你想做类似的事情:

awk -v tailStart=1000 '
{ sumAll += ; valsAll[NR] = [=10=] }
NR>=tailStart { sumTail +=  }
END {
    for (i=1; i<=NR; i++) {
        do stuff with valsAll[i] and sumAll
    }
    for (i=tailStart; i<=NR; i++) {
        do stuff with valsAll[i] and sumTail
    }
}
' file