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

У меня есть следующий скрипт в командной строке 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'` 

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 
  • Почему результаты сравнения строк всегда ложны
  • Найти файл с расширением .csv в каталоге, соответствующем шаблону
  • Какие специальные параметры оболочки (bash)?
  • Выдать команду в каждом каталоге
  • Сценарий оболочки, использующий функцию (), не находящую команду
  • Может ли любая оболочка использовать интерактивный поиск на уровне аргументов?
  • Зацикливание по папке в любом случае входит в цикл
  • Как удалить имя из фамилии, когда длина неизвестна?
  • SSH для сервера, а также команды выполнения и печати
  • Как заставить xargs обрабатывать пробелы и специальные символы из кошки?
  • Функция Shell, чтобы проверить, есть ли приостановленный процесс, являющийся дочерним элементом этой оболочки?
  • Как запускать команды надстройки по SSH?
  • Interesting Posts

    Команда для извлечения списка символов в заданном классе символов в текущей локали

    CentOS5, RHEL5, Java-зависимые пакеты, альтернативные JVM / JDK

    Как получить n строк для каждой строки m (n <m) в командной строке?

    Не удается открыть файл общих объектов при использовании компилятора D

    Прямой вывод / вывод видео на внешний сервер

    Избегать вставки с помощью колеса мыши

    Как узнать, какая библиотека и справочная страница будут найдены в первую очередь?

    Интерпретация результатов команды Gnu `df` в Linux

    bnx2: Не удается загрузить файл прошивки «bnx2 / bnx2-mips-09-6.2.1b.fw»

    Что происходит, когда я убиваю ‘cp’? Это безопасно и имеет ли это какие-либо последствия?

    Что означает «Невозможно сделать / удалить запись для указанного сеанса»?

    Как отображать только файлы .txt с именем ScheduledJobs в них

    Создание файловой системы в обычном файле с помощью FreeBSD

    Свяжите два интернет-соединения различного качества

    Добавить пользователя в основную группу другого пользователя

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