web-dev-qa-db-ja.com

bc(1)を取得して先頭のゼロを出力するにはどうすればよいですか?

Makefileで次のようなことを行います。

echo "0.1 + 0.1" | bc

(実際のファイルでは、数字はもちろん動的です)

.2しかし、印刷したい0.2

sedに頼らずにこれを実行したいのですが、bcを取得してゼロを出力する方法が見つからないようです。それとも、bcはこれを行うことができませんか?

57
rwos

また、awkを使用してフォーマットすることもできます。

 echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}'

またはawk自体が計算を行う場合:

 echo "0.1 0.1" | awk '{printf "%f", $1 + $2}'
39
Elias Dorneles

これはあなたのために働くかもしれません:

echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc
33
potong

ソースbc_out_num()、行1461を参照)を簡単に確認した後、整数の場合に先頭の0が出力されるようにする明確な方法がわかりません。部分は0です。何かを見逃していない限り、この動作はコマンドラインフラグを使用して変更できるパラメーターに依存しません。

短い答え:いいえ、bcがあなたの望むように数字を表示する方法はないと思います。

sedを使用したい場合、bcを使用しても何も問題はありません。以下は、恐ろしくは見えません、私見:

[me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./'
0.2

本当にsedを避けたい場合は、 eljunior'schoroba's の両方の提案は非常に適切ですが、後続のゼロを避けるために値に依存した調整が必要です。それはあなたにとって問題かもしれませんし、そうでないかもしれません。

23
Shawn Chin

ドキュメントに出力形式に関する情報が見つかりません。 sedの代わりに、printfにアクセスすることもできます。

printf '%3.1f\n' $(bc<<<0.1+0.1)
9
choroba

これも負の数を処理します:

echo "0.1 - 0.3" | bc | sed -r 's/^(-?)\./\10./'
3
user3420895
$ bc -l <<< 'x=-1/2; if (length (x) == scale (x) && x != 0) { if (x < 0) print "-",0,-x else print 0,x } else print x'

これは純粋なbcです。 lengthの結果を式のscaleと比較することにより、先行ゼロを検出します。正数と負数の両方で機能します。

3
gomibako

正の数の場合、ゼロ(文字列)を印刷するのと同じくらい簡単です。

$ echo '"0";0.1+0.1' | bc
0.2

数値が1より大きい(または等しい)場合はゼロを避けます。

$ echo 'x=0.1+0.1;  if(x<1){"0"};  x' | bc
0.2

数値が負の場合、少し複雑になります。

echo 'x= 0.3 - 0.5 ; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1) {"0"};x' | bc
-0.2

関数を定義してライブラリに追加できます:

$ echo 'define leadzero(x){auto s;
        s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"};
        return(x)};
        leadzero(2.1-12.4)' | bc
-10.3

$ echo 'define leadzero(x){auto s;
        s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"};
        return(x)};
        leadzero(0.1-0.4)' | bc
-0.3
2
Isaac

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

これは、結果が次のすべての場合に機能するはずです。

  • 「-.123」
  • 「.123」
  • 「-1.23」
  • 「1.23」

説明:

  1. -.で始まるものすべてについて、-.-0.に置き換えます

  2. .で始まるものすべてについて、.0.に置き換えます

2
cafemike

おそらく、bcは現代にとって最高の「ベンチ計算機」ではありません。他の言語を使用すると、より細かく制御できます。範囲(-1.0 .. + 1.0)の値に先行ゼロを付けて出力する作業例を次に示します。これらの例では、 bcAWK 、および 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倍遅いことに注意してください。

1
nobar

これは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
1
Aquarius Power

ポトンでの構築 answer

分数結果の場合:

echo "x=0.1 + 0.1; if(x<1 && x > 0) print 0; x" | bc -l

否定的な結果は正しく表示されないことに注意してください。 Aquarius Powerには solution があります。

0
Oliver Grant