2010-06-03 40 views
5

Chúc mừng!Tập lệnh Bash: chỉ định định dạng số đầu ra bc

Tôi sử dụng để thực hiện một số phép tính trong tập lệnh của mình. Ví dụ:

bc 
scale=6 
1/2 
.500000 

Để sử dụng thêm trong tập lệnh, tôi cần "0.500000" insted ".500000".

Bạn có thể giúp tôi vui lòng định cấu hình định dạng số đầu ra bc cho trường hợp của tôi không?

Trả lời

3

Nhanh chóng và dơ bẩn, vì scale chỉ áp dụng cho các chữ số thập phân và bc dường như không có một chức năng sprintf -like:

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

+1 cho giải pháp này: không có nhu cầu sử dụng các công cụ khác như awk. –

1

Bạn có thể đặt việc sử dụng bc vào một bối cảnh ít tốt hơn? Bạn đang sử dụng kết quả của bc để làm gì?

Do sau đây trong một tập tin gọi là some_math.bc

scale=6 
output=1/2 
print output 

trên dòng lệnh tôi có thể làm như sau để thêm một số không:

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

Nếu tôi chỉ cần chuỗi đầu ra để có một không cho mục đích định dạng, tôi muốn sử dụng awk.

2

Tôi tin rằng đây là phiên bản sửa đổi của hàm:

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

Đây có phải là câu trả lời không? –

3

Chỉ cần làm tất cả những tính toán và đầu ra của bạn trong awk:

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

Là một thay thế, nếu bạn muốn sử dụng bc và không sử dụng AWK một mình hoặc với 'bc', số printf của Bash hỗ trợ các số dấu phẩy động mặc dù phần còn lại của Bash không.

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

Dòng thứ hai ở trên có thể thay thế:

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

Những công trình giống như sprintf sẽ và không tạo ra một subshell.

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

Trong một dòng:

printf "%0.6f\n" $(bc -q <<< scale=6\;1/2) 
Các vấn đề liên quan