Como formatar o número decimal para exibir o zero, mas não os que estão à direita?

2

Eu tenho o seguinte script no prompt de comando bash do Ubuntu 14.04.1 LTS de 64 bits:

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

Eu gostaria de ter f exibido como 0.03, 0.042, 0.054, .... 0.138, 0.15 e isso é crítico, já que f é usado dentro de nomes de arquivos, como hsli0.03.h5 . Alguém pode me apontar na direção certa? Eu não estou muito familiarizado com aritmética em shell.

EDIT : Eu tentei a seguinte construção, mas ela não produz a saída desejada; além disso, a opção de escala para bc parece não funcionar.

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

EDIT2 : funciona com o seguinte comando:

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

2 respostas

1

O suporte aritmético de ponto flutuante no bash é muito fraco. Você ainda pode usar printf , embora:

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

Se você quiser apenas adicionar 0 a., poderá usar a expansão de parâmetro:

f=${f/#./0.}
# if negative numbers are possible, too
f=${f/#-./-0.}
    
por 20.02.2015 / 12:09
3

Em bc , scale é uma variável especial usada para limitar a escala (o número de dígitos após a vírgula) do resultado de alguns operadores, como / (divisão ). Não é a precisão em números exibida por bc , é usada em computação.

Por exemplo, em scale=1; 1/3 , o resultado é 0.3 ( 3/10 ), que está bem longe de 1/3 .

Você deve usar valores de grande escala para o seu cálculo e somente reduzir scale para exibição (por exemplo, dividindo por 1 no final).

Compare:

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

com:

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

Eu escrevia:

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
    
por 20.02.2015 / 17:57