如何缩短bash中的十进制输出?

如何缩短bash中的十进制输出?

现在我正在做一项涉及高级管道的作业,其中一个问题涉及计算百分比并将其缩短到小数点后三位。我已经成功计算了百分比:

echo "$ERRORS" / "$TOTAL" \* 100 | bc -l

这给出了正确的输出:2.64905226881102814400

ERRORS 和 TOTAL 都是包含整数的环境变量。

但我真的不知道如何修改此命令以仅输出 2.649 而不是完整的数字。我知道有一种方法可以使用 bc 中的“scale”来缩短到一定数量的小数位,但我尝试过echo scale=3; "$ERRORS" / "$TOTAL" \* 100 | bc -l,但没有成功。

我究竟做错了什么?

答案1

尝试:

$ ERRORS=1153 TOTAL=43525
$ echo "scale = 3; $ERRORS * 100 / $TOTAL" | bc
2.649

反而。看看在这种情况下如何scale = 3被输入来bc设置比例变量bc,这是数字的位数除法的基数之后,以及我们如何乘以 100该部门。

请注意,这是截断,而不是四舍五入。例如,8 * 100 / 9 将变为 88.888,而不是 88.889。

如果您的 shell 支持浮点运算(ksh93、zsh、yash),您还可以执行以下操作:

$ printf '%.3f\n' "$((ERRORS * 1e2 / TOTAL))"
2.649

(但请注意,在 zsh 和 ksh93 中,控制这些变量的内容至关重要,否则将构成命令注入漏洞。我们使用1e2(浮点数 100,而100为整数)而不是100.ksh93 中的那样,这100.是行不通的在用作,十进制基数的语言环境中)。

或者你可以使用awk

$ awk -- 'BEGIN{printf "%.3f\n", ARGV[1] * 100 / ARGV[2]}' "$ERRORS" "$TOTAL"
2.649

对于 9 个中的 8 个,这两者都会为您提供 88.889%(或可能为 88,889,具体取决于区域设置)。

相关内容