如何将管道输出传入echo作为变量执行除法运算并保留两位小数
用bc实现两文件整数除法并保留两位小数的正确方法
你之前的尝试问题出在这两点:
- 单引号包裹的字符串里,
$(...)这类命令替换不会被Shell解析,bc会把它当成无效语法 - 先执行除法再设置
scale=2,顺序颠倒,无法控制小数位数
下面是几种可行的实现方式:
方法1:双引号展开命令替换
直接用双引号让Shell解析paste的结果,生成完整的bc计算表达式:
echo "scale=2; $(paste -d'/' total.txt count.txt)" | bc -l
比如total.txt是100、count.txt是3时,Shell会把$(paste...)替换成100/3,最终传给bc的是scale=2; 100/3,得到结果33.33。
方法2:xargs替换占位符
用xargs -I{}把管道传来的除法表达式替换到bc命令里:
paste -d'/' total.txt count.txt | xargs -I{} echo "scale=2; {}" | bc -l
-I{}指定用管道内容替换字符串里的{},和方法1效果一致。
方法3:用here-string简化输入
不用echo,直接通过here-string把表达式传给bc:
bc -l <<< "scale=2; $(paste -d'/' total.txt count.txt)"
补充:和awk一致的四舍五入效果
注意:bc的scale=2是直接截断小数,而你之前用的awk '{printf "%.2f", $1/$2}'是四舍五入。如果要和awk效果对齐,可以先让bc算出高精度结果,再用printf处理:
printf "%.2f\n" $(bc -l <<< "$(paste -d'/' total.txt count.txt)")
比如100/3会得到33.33,100/7会得到14.29(bc直接算100/7是14.2857...,printf四舍五入后是14.29)。
内容的提问来源于stack exchange,提问作者Yitasha
相关产品推荐
相关产品推荐

