como fazer bc me mostrar 10 e não 10.00

6
#!/bin/bash 
q=$(bc <<< "scale=2;$p*100")
head -n$q numbers.txt > secondcoordinate.txt

Isso é apenas parte do roteiro, mas acho que é suficiente para esclarecer minhas intenções. p é uma variável com apenas dois decimais, então q deve ser um inteiro ... No entanto, bc mostra, por exemplo, 10.00 em vez de 10 .

Como posso resolver isso?

    
por Diego 03.11.2016 / 01:13

3 respostas

6

Você não pode fazer isso com o óbvio scale=0 devido ao modo como a escala é determinada.

A documentação explica indiretamente que a divisão por um é suficiente para redefinir a saída para corresponder ao valor de scale , cujo padrão é zero:

expr1 / expr2 The result of the expression is the quotient of the two expressions. The scale of the result is the value of the variable scale.

p=12.34; echo "($p*100)" | bc
1234.00

p=12.34; echo "($p*100)/1" | bc
1234

Se a sua versão de bc não lidar com isso, transmita-a por sed :

p=12.34; echo "($p*100)" | bc | sed 's!\.0*$!!'
1234

Este RE só tira zeros à direita de um número inteiro. Então, 3,00 reduzirá para 3, mas 3,10 não reduzirá para 3,1. Se você realmente precisa da capacidade total de retirar os zeros à direita de um número decimal, é necessário um PCRE:

p=12.34; echo "($p*100)" | bc | perl -pe '/\./ && s/0+$/$1/ && s/\.$//'

Mas se você for usar perl , pode dispensar bc :

p=12.34; perl -e '$p = shift; print $p * 100, "\n"' "$p"
    
por 03.11.2016 / 01:28
4

você pode usar o awk para calcular os valores

bash-3.2$ p=0.01
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
1


bash-3.2$ p=0.02
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2


bash-3.2$ p=0.022
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2.2
    
por 03.11.2016 / 01:34
3

TL; DR

Você tem muitas opções. bc tem um comportamento conhecido em que scale=0 nem sempre faz o que você espera, mas há muitas soluções alternativas. Aqui estão apenas alguns.

printf

Use printf para limitar sua saída a números inteiros.

$ printf "%g\n" $(echo '12.34 * 100' | bc)
1234

bc com divisão

Se você quiser ficar com o escalonamento bc , você precisa especificar uma escala de zero e dividir por 1 para redefinir a escala. Esse é um comportamento conhecido, mas eu realmente não consigo explicar o porquê dele.

$ echo '12.34 * 100 / 1' | scale=0 bc
1234

sed

Apenas tire os caracteres indesejados.

$ echo '12.34 * 100' | bc | sed 's/\.00$//'
1234

bash

Use uma expansão de chave para retornar o valor antes do decimal.

$ p='12.34'; q=$(bc <<< "scale=2; $p*100"); echo ${q%%.00}
1234
    
por 03.11.2016 / 09:55

Tags