如何选择两个操作的范围?

时间:2015-02-26 12:36:45

标签: awk gawk

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

awk '   { sum+=$2; array[NR]=$2 }
        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?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

awk '   
 NR >= 10000 { sum+=$2; array[NR]=$2 }
 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)  
 }'

答案 1 :(得分:1)

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

awk -v tailStart=1000 '
{ sumAll += $2; valsAll[NR] = $0 }
NR>=tailStart { sumTail += $2 }
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