2010-06-03 89 views
5

問候!Bash腳本:指定bc輸出數字格式

我使用在我的腳本中進行一些計算。例如:

bc 
scale=6 
1/2 
.500000 

對於我的腳本中的進一步用法,我需要「0.500000」insted「.500000」。

你能幫我配置bc輸出數字格式嗎?

回答

3

快速和骯髒的,因爲scale僅適用於十進制數字和bc似乎並不具有sprintf般的功能:

$ bc 
scale = 6 
result = 1/2 
if (0 <= result && result < 1) { 
    print "0" 
} 
print result; 
+0

+1此解決方案:無需使用其他工具,如AWK。 – 2010-06-04 04:20:15

1

你可以把BC使用到好一點的情況下?你使用bc的結果是什麼?

由於在文件中的以下稱爲some_math.bc

scale=6 
output=1/2 
print output 

在命令行上我可以做以下補充零:

$ bc -q some_math.bc | awk '{printf "%08f\n", $0}' 
0.500000 

如果我只需要輸出字符串中有一個爲了格式化目的,我使用awk。

2

我相信在這裏被修改版本的函數:

float_scale=6 

function float_eval() 
{ 
    local stat=0 
    local result=0.0 
    if [[ $# -gt 0 ]]; then 
     result=$(echo "scale=$float_scale; $*" | bc -q | awk '{printf "%f\n", $0}' 2>/dev/null) 
     stat=$? 
     if [[ $stat -eq 0 && -z "$result" ]]; then stat=1; fi 
    fi 
    echo $result 
    return $stat 
} 
+0

這是答案嗎? – 2010-06-03 14:42:23

3

只是做所有的計算和輸出在AWK:

float_scale=6 
result=$(awk -v scale=$floatscale 'BEGIN { printf "%.*f\n", scale, 1/2 }') 

作爲替代方案,如果你願意使用bc而不是單獨使用AWK或與'bc'一起使用,Bash的printf支持浮點數,即使Bash的其餘部分都不支持。

result=$(echo "scale=$float_scale; $*" | bc -q 2>/dev/null) 
result=$(printf '%*.*f' 0 "$float_scale" "$result") 

上面的第二行可以替換爲:

printf -v $result '%*.*f' 0 "$float_scale" "$result" 

其中一期工程的有點像sprintf會和不會創建一個子shell。

2
echo "scale=3;12/7" | bc -q | sed 's/^\\./0./;s/0*$//;s/\\.$//' 
14

在一個行:

printf "%0.6f\n" $(bc -q <<< scale=6\;1/2)