如何让bc(1)打印前导零?

rwo*_*wos 57 unix bash bc

我在Makefile中执行以下操作:

echo "0.1 + 0.1" | bc
Run Code Online (Sandbox Code Playgroud)

(在实际文件中,数字是动态的,当然)

它打印.2但我想要它打印0.2.

我想这样做而不诉诸,sed但我似乎无法找到如何bc打印零.或者bc只是不能这样做?

Eli*_*les 39

您也可以使用awk格式化:

 echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}'
Run Code Online (Sandbox Code Playgroud)

或者用awk本身做数学运算:

 echo "0.1 0.1" | awk '{printf "%f", $1 + $2}'
Run Code Online (Sandbox Code Playgroud)

  • 这很酷.为什么我总是忘记awk? (5认同)

pot*_*ong 33

这可能对你有用:

echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc
Run Code Online (Sandbox Code Playgroud)

  • 可能值得添加另一个条件来检查您没有破坏负数,就好像您不小心以下 `echo "scale=3; x=-0.5; if(x&lt;1) print 0; x" | bc` 会产生 0-.5 。以下 `echo "scale=3; x=-0.5; if(x&gt;0 &amp;&amp; x&lt;1) print 0; x" | bc` 打印 `-.5`,这不太正确。下面的内容更健壮,但冗长且繁琐。YMMV。`回声'比例= 3;x=-0.5;if(x&gt;-1 &amp;&amp; x&lt;1) { if(x&lt;0) { 打印“-”; x=0-x }; 打印 0} ;x'| 公元前` (5认同)
  • 但是,不适用于负面结果. (4认同)

Sha*_*hin 23

在快速查看源代码之后(参见bc_out_num()第1461行),0如果整数部分是,我没有看到明显的方法来使得前导格式化0.除非我遗漏了某些内容,否则此行为不依赖于可以使用命令行标志更改的参数.

简答:不,我认为没有办法bc按照你想要的方式制作印刷品.

sed如果您仍想使用,我认为使用时没有任何问题bc.以下看起来并不可怕,恕我直言:

[me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./'
0.2
Run Code Online (Sandbox Code Playgroud)

如果你真的想避免sed,eljuniorchoroba的建议都非常简洁,但它们需要依赖于价值的调整来避免尾随零.这对您来说可能是也可能不是问题.


cho*_*oba 9

我在文档中找不到任何有关输出格式的内容.而不是sed,你也可以达到printf:

printf '%3.1f\n' $(bc<<<0.1+0.1)
Run Code Online (Sandbox Code Playgroud)

  • @rwos我是第二个.sed是一个更清洁的`echo".1 + .1"| bc | sed's /^\./ 0 ./'` (3认同)
  • `printf "%g\n" $(bc&lt;&lt;&lt;0.1+0.1)` :-) (2认同)

caf*_*ike 5

echo "$a / $b" | bc -l | sed -e 's/^-\./-0./' -e 's/^\./0./'

这应该适用于结果为以下情况的所有情况:

  • “-.123”
  • “.123”
  • “-1.23”
  • “1.23”

解释:

  1. 对于仅以 开头的所有内容-.,替换-.-0.

  2. 对于仅以 开头的所有内容.,替换.0.