Makefileで次のようなことをします。
echo "0.1 + 0.1" | bc
(もちろん、実際のファイルでは数値は動的です)
印刷.2
しますが、印刷したいです0.2
。
頼らずにやりたいのですが、ゼロを印刷するsed
方法がわからないようです。bc
それともbc
、これを行うことができないのですか?
awk を使用してフォーマットすることもできます。
echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}'
または awk 自体が計算を行う:
echo "0.1 0.1" | awk '{printf "%f", $1 + $2}'
これはあなたのために働くかもしれません:
echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc
ソース(のbc_out_num()
1461 行を参照) をざっと見てみると0
、整数部分が0
. 何か見落としがない限り、この動作はコマンドライン フラグを使用して変更できるパラメータに依存しません。
簡単な答え:いいえ、bc
印刷番号を思い通りにする方法はないと思います。
sed
それでも使用したい場合は、使用しても問題はないと思いますbc
。以下は、私見ですが、それほど恐ろしいものではありません。
[me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./'
0.2
本当に回避したい場合は、 eljuniorとchoroba のsed
両方の提案は非常に優れていますが、末尾のゼロを回避するために値に応じた調整が必要です。それはあなたにとって問題になるかもしれませんし、そうでないかもしれません。
ドキュメントで出力形式について何も見つかりません。sed の代わりに、printf を使用することもできます。
printf '%3.1f\n' $(bc<<<0.1+0.1)
echo "$a / $b" | bc -l | sed -e 's/^-\./-0./' -e 's/^\./0./'
これは、結果が次のようなすべてのケースで機能するはずです。
説明:
で始まるものはすべて-.
、に置き換え-.
ます-0.
で始まるものはすべて.
、に置き換え.
ます0.
おそらく、bc
現代にとって最高の「ベンチ電卓」とは言えません。他の言語では、より詳細に制御できます。以下は、先頭にゼロを付けて範囲 (-1.0..+1.0) の値を出力する実際の例です。これらの例では、 Here String構文とともにbc
、AWK
、および を使用しています。Python 3
#!/bin/bash
echo "using bc"
time for (( i=-2; i<=+2; i++ ))
{
echo $(bc<<<"scale=1; x=$i/2; if (x==0||x<=-1||x>=1) { print x } else { if (x<0) { print \"-0\";-x } else { print \"0\";x } } ")
}
echo
echo "using awk"
time for (( i=-2; i<=+2; i++ ))
{
echo $(echo|awk "{printf \"%.1f\",$i/2}")
}
echo
echo "using Python"
time for (( i=-2; i<=+2; i++ ))
{
echo $(python3<<<"print($i/2)")
}
それが重要な場合、Python バージョンは約 10 倍遅いことに注意してください (それでもほとんどの目的で非常に高速です)。
sh
orで自明でない計算を行うbc
のはばかげた用事です。今日では、はるかに優れたベンチ電卓が利用可能です。たとえば、Here Documentsを使用して、Bash スクリプト内に Python サブルーチンを埋め込んで実行できます。
function mathformatdemo {
python3<<SCRIPT
import sys
from math import *
x=${1} ## capture the parameter from the shell
if -1<=x<=+1:
#print("debug: "+str(x),file=sys.stderr)
y=2*asin(x)
print("2*asin({:2.0f})={:+6.2f}".format(x,y))
else: print("domain err")
SCRIPT
}
echo "using Python via Here-doc"
time for (( i=-2; i<=+2; i++ ))
{
echo $(mathformatdemo $i)
}
出力:
using Python via Here-doc
domain err
2*asin(-1)= -3.14
2*asin( 0)= +0.00
2*asin( 1)= +3.14
domain err
これはbcのみを使用し、負の数で機能します:
bc <<< "x=-.1; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";
試してみてください:
for y in "0" "0.1" "-0.1" "1.1" "-1.1"; do
bc <<< "x=$y; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";
echo;
done