Сценарий Bash: укажите формат выходного числа bc - PullRequest
8 голосов
/ 03 июня 2010

Привет!

Я использую , чтобы сделать некоторые вычисления в моем скрипте. Например:

bc
scale=6
1/2
.500000

Для дальнейшего использования в моем скрипте мне нужно "0.500000" вместо ".500000".

Не могли бы вы помочь мне, пожалуйста, настроить формат вывода номера bc для моего случая?

Ответы [ 6 ]

18 голосов
/ 31 августа 2013

В одну строку:

printf "%0.6f\n" $(bc -q <<< scale=6\;1/2)
3 голосов
/ 03 июня 2010

Просто сделайте все ваши расчеты и выведите в awk:

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

В качестве альтернативы, если вы предпочитаете использовать bc и не использовать AWK в одиночку или с помощью 'bc', Bash's 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 и не создает подоболочки.

3 голосов
/ 03 июня 2010

Быстро и грязно, поскольку scale применяется только к десятичным цифрам, а bc, похоже, не имеет sprintf -подобной функции:

$ bc
scale = 6
result = 1 / 2
if (0 <= result && result < 1) {
    print "0"
}
print result;
2 голосов
/ 04 июля 2013
echo "scale=3;12/7" | bc -q | sed 's/^\\./0./;s/0*$//;s/\\.$//'
2 голосов
/ 03 июня 2010

Я считаю, что здесь модифицированная версия функции:

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
}
1 голос
/ 03 июня 2010

Можете ли вы представить использование 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...