Как форматировать десятичное число, чтобы отображать прецизионные ноль, но не конечные?

У меня есть следующий скрипт в командной строке Ubuntu 14.04.1 LTS 64-bit bash:

S=0.030 F=0.150 N=10 reso=20 DIFF=`echo "scale=3; $F - $S" | bc -l` df=`echo "scale=3; $DIFF / $N" | bc -l` is=`echo "scale=3; $S / $df" | bc -l` if=`echo "scale=3; $F / $df" | bc -l` cd wgdisp-out for i in `seq 0 $N` do f=`echo "scale=3; $S + $i * $df" | bc -l | awk ' sub("\\.*0+$","") '` #h5totxt hsli0$f.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n '/^[[:digit:]]/p' | cut -d , -f 1 echo $f done 

Я хотел бы, чтобы f отображался как 0.03, 0.042, 0.054, .... 0.138, 0.15 и это важно, так как f используется внутри имен файлов, таких как hsli0.03.h5 . Может ли кто-нибудь указать мне в правильном направлении? Я не очень хорошо знаком с арифметикой в ​​оболочке.

EDIT : я попробовал следующую конструкцию, но она не дает желаемого результата; кроме того, вариант масштабирования для bc , похоже, не работает.

 f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./' -e 's/$^\/0/./'` 

EDIT2 : он работает со следующей единственной командой:

 f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./;s/[0]*$//g'` 

  • Универсальная альтернативная альтернатива non-bash `time`?
  • что означает $ * в shell
  • Странная разница между pwd и / bin / pwd
  • Относительно отдельного файла в несколько файлов в соответствии с разделом строк
  • Как rsync файлы между двумя пультами?
  • Чтение содержимого в строке в bash
  • Как использовать inotifywait для просмотра каталога для создания файлов определенного расширения
  • Удаление черной полосы в sed
  • 2 Solutions collect form web for “Как форматировать десятичное число, чтобы отображать прецизионные ноль, но не конечные?”

    Арифметическая поддержка с плавающей запятой в bash очень плохая. Вы все равно можете использовать printf :

     printf '%5.3f\n' $f printf '%.3g\n' $f 

    Если вы просто хотите добавить 0 к., Вы можете использовать расширение параметра:

     f=${f/#./0.} # if negative numbers are possible, too f=${f/#-./-0.} 

    В bc scale – это специальная переменная, которая используется для ограничения масштаба (число цифр после запятой) результата некоторых операторов, таких как / (деление). Это не точность чисел, отображаемых с помощью bc , она используется при вычислении.

    Например, в scale=1; 1/3 scale=1; 1/3 , результат 0.3 ( 3/10 ), что довольно далеко от 1/3 .

    Вы должны использовать масштабные значения для своих вычислений и уменьшать scale отображения (например, путем деления на 1 в конце).

    Для сравнения:

     $ echo "scale=100; r=1/3*300; scale=3; r/1" | bc 99.999 

    с:

     $ echo "scale=3; 1/3*300" | bc 99.900 

    Я бы написал:

     n=10 echo " s = 0.030 f = 0.150 n = $n r = 20 scale = 100 d = (f - s) / n scale = 3 for (i = s; i <= f; i += d) i/1" | bc | sed 's/^\./0./;s/0*$//' | while read f; do h5totxt "hsli$f.h5" | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 done 
    Interesting Posts

    Создание сетевого сервера хранения данных, компромиссы с различными конфигурациями RAID?

    file / libmagic: Какова длина ID3?

    / bin / sh – echo >> не работает как ожидалось

    Grub2 не обновляется

    Ограничения на количество файловых дескрипторов

    Sphinx Search shutdown down после `FATAL: accept () не удалось: Слишком много открытых файлов`

    Как получить номера телефонов из файла в правильном формате с помощью awk? Рабочий скрипт нуждается в настройке

    Как настроить маршрутизатор linux, чтобы клиенты могли использовать максимальную пропускную способность?

    Как представить команду в нескольких строках для мгновенного копирования / вставки?

    Как я могу заставить stdin всегда потребляться?

    Почему CONFIG_NO_HZ не установлен по умолчанию

    Статическая конфигурация IPv4 и IPv6 на openwrt linux

    Может ли linux работать на флэш-накопителе на длительный срок?

    Названия функций Upstart и bash, содержащие "-"

    Клиент электронной почты командной строки, который синхронизирует контакты с внешним сервером?

    Linux и Unix - лучшая ОС в мире.