我想计算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?
提前致谢。
答案 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