如何在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
我想计算 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