Como mover o ponto decimal no bash

3

Eu tenho uma variável que é armazenada como "1.20E20". Eu gostaria que ele fosse alterado para "0.0120E22". Existe um comando simples para alterar esse valor? Eu tentei

let nh=$nh/100

Mas isso não funcionou; Eu suponho que é por causa do valor do caractere na variável. Eu sei que existem várias soluções; qual é a melhor maneira de resolver isso?

    
por J. Doe 06.06.2018 / 20:04

2 respostas

6

Eu não sei como forçar printf a mudar o expoente. Vamos fazer isso manualmente: multiplique o coeficiente por 10 -2 e adicione 2 ao expoente.

n=1.20E20
m=2
IFS="E" read coeff exp <<<"$n"
new=$(printf "%.4fE%d\n" "$(echo "$coeff * 10^-($m)" | bc -l)" "$((exp+m))")
# => 0.0120E22

Podemos validar com:

$ printf "%e\n" "$new"
1.200000e+20
    
por glenn jackman 06.06.2018 / 20:29
2

Eu escrevi um script simples de bash assim:

#!/bin/bash
a=${1%E*}
b=${1#*E}
echo 0$(<<<"scale=4;$a/10^$2" bc)E$((b+$2))

Você só precisa fornecer os valores como argumentos, primeiro o número e depois o turno:

$ bash /path/to/script 1.20E20 2
0.0120E22
  # or, as a oneliner:
$ bash -c 'echo 0$(<<<"scale=4;${1%E*}/10^$2" bc)E$((${1#*E}+$2))' _ 1.20E20 2
0.0120E22
    
por dessert 06.06.2018 / 20:16