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

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

  • Действительно ли программы `if` и` then`
  • Я хочу разделить сумму чисел на значение
  • OpenSSH - псевдонимы карт в ~ / .ssh / config для IP-адресов в командной строке
  • открыть файл, используя CDPATH и символическую ссылку
  • индикатор выполнения, чтобы узнать, сколько выполнено выход скрипта оболочки
  • Как проверить, содержит ли строка подстроку в тире или золе?
  • Сравните два файла с первым столбцом и удалите повторяющуюся строку из второго файла в сценарии оболочки
  • Как открыть все файлы, которые являются результатом команды ls?
  • 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 
    Linux и Unix - лучшая ОС в мире.