【发布时间】:2012-03-07 13:17:14
【问题描述】:
当我尝试使用 awk 计算平均值和标准差时,我得到“awk:致命:除零尝试”错误。
我的命令是
awk '{s+=$3} END{print $2"\t"s/(NR)}' >> mean;
awk '{sum+=$3;sumsq+=$3*$3} END {print $2"\t"sqrt(sumsq/NR - (sum/NR)^2)}' >>sd
有人知道怎么解决吗?
【问题讨论】:
标签: awk
当我尝试使用 awk 计算平均值和标准差时,我得到“awk:致命:除零尝试”错误。
我的命令是
awk '{s+=$3} END{print $2"\t"s/(NR)}' >> mean;
awk '{sum+=$3;sumsq+=$3*$3} END {print $2"\t"sqrt(sumsq/NR - (sum/NR)^2)}' >>sd
有人知道怎么解决吗?
【问题讨论】:
标签: awk
你的问题是......你被零除。
你有两个命令:
awk '{s+=$3} END{print $2"\t"s/(NR)}' >> mean;
awk '{sum+=$3;sumsq+=$3*$3} END {print $2"\t"sqrt(sumsq/NR - (sum/NR)^2)}' >>sd
第一个命令从标准输入读取到 EOF。然后运行第二个命令,尝试读取标准输入,但是发现它是空的,所以它读取了零条记录,所以NR 是零,你正在除以 0,然后崩溃。
您需要在一个命令中同时处理均值和标准差。
awk '{s1 += $3; s2 += $3*$3}
END { if (NR > 0){
print $2 "\t" s1 / NR;
print $2 "\t" sqrt(s2 / NR - (s1/NR)^2);
}
}'
这样可以避免除零错误。
【讨论】:
END 块是出现问题的地方。实际上,您的提案在语法上是错误的;如果您省略了if,它将“工作”,但仍会在输入为空的情况下除以零。