как сделать bc, чтобы показать мне 10, а не 10.00

#!/bin/bash q=$(bc <<< "scale=2;$p*100") head -n$q numbers.txt > secondcoordinate.txt 

Это всего лишь часть сценария, но я думаю, что этого достаточно, чтобы прояснить мои намерения. p – переменная с двумя десятичными запятыми, поэтому q должно быть целым числом … Тем не менее, bc показывает, например, 10.00 вместо 10 .

Как я могу это решить?

  • Работа с поплавком с bc?
  • Ошибка синтаксиса, сравнивающая поплавки с bc
  • Как показать ноль до десятичной точки в bc?
  • Как получить bc для начала десятичных дробей с начальным нулем
  • BC не обрабатывает масштаб = 0 правильно
  • Как избежать обертывания в выходе bc
  • Как показать ноль до десятичной точки в bc?
  • Понять «ibase» и «obase» в случае конверсий с bc?
  • Как избежать обертывания в выходе bc
  • BC не обрабатывает масштаб = 0 правильно
  • Ошибка синтаксиса, сравнивающая поплавки с bc
  • Как получить bc для начала десятичных дробей с начальным нулем
  • 3 Solutions collect form web for “как сделать bc, чтобы показать мне 10, а не 10.00”

    Вы не можете сделать это с очевидным scale=0 из-за того, как определяется масштаб.

    Документация косвенно объясняет, что деление на единицу достаточно для сброса вывода в соответствии со значением scale , которое по умолчанию равно нулю:

    expr1 / expr2 . Результатом выражения является фактор двух выражений. Масштабы результата – это значение переменной шкалы.

     p=12.34; echo "($p*100)" | bc 1234.00 p=12.34; echo "($p*100)/1" | bc 1234 

    Если ваша версия bc не справляется с этим, проведите ее через sed :

     p=12.34; echo "($p*100)" | bc | sed 's!\.0*$!!' 1234 

    Этот RE будет только отбрасывать конечные нули из целого числа. Так что 3.00 уменьшится до 3, но 3.10 не уменьшится до 3.1. Если вам действительно нужна полная возможность сбрасывать конечные нули из десятичного числа, требуется PCRE:

     p=12.34; echo "($p*100)" | bc | perl -pe '/\./ && s/0+$/$1/ && s/\.$//' 

    Но если вы собираетесь использовать perl тогда вы можете обойтись без bc в первую очередь:

     p=12.34; perl -e '$p = shift; print $p * 100, "\n"' "$p" 

    вы можете использовать awk для вычисления значений

     bash-3.2$ p=0.01 bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}') bash-3.2$ echo $q 1 bash-3.2$ p=0.02 bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}') bash-3.2$ echo $q 2 bash-3.2$ p=0.022 bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}') bash-3.2$ echo $q 2.2 

    TL; DR

    У вас много вариантов. bc знает поведение, когда scale=0 не всегда делает то, что вы ожидаете, но есть много обходных решений. Здесь только несколько.

    Printf

    Используйте printf для ограничения вывода на целые числа.

     $ printf "%g\n" $(echo '12.34 * 100' | bc) 1234 

    bc с делением

    Если вы хотите придерживаться масштабирования bc , вам нужно указать как шкалу нуля, так и разделить на 1, чтобы сбросить масштаб. Это известное поведение, но я действительно не могу объяснить, почему.

     $ echo '12.34 * 100 / 1' | scale=0 bc 1234 

    СЕПГ

    Просто удалите ненужные завершающие символы.

     $ echo '12.34 * 100' | bc | sed 's/\.00$//' 1234 

    удар

    Используйте расширение скобки, чтобы вернуть значение до десятичного знака.

     $ p='12.34'; q=$(bc <<< "scale=2; $p*100"); echo ${q%%.00} 1234 
    Linux и Unix - лучшая ОС в мире.