Acrescentar a um tubo e passar?

0

Eu tenho uma função bash simples dividindo dois números:

echo "750/12.5" | bc

Eu gostaria de pegar a saída de bc e acrescentar /24 e canalizar o resultado para outra instância de bc .

Algo como:

echo "750/12.5" | bc | echo $1 + "/24" | bc

Onde $1 é o resultado da canalização.

P.S. Eu percebo que eu poderia fazer apenas echo "750/12.5/24" | bc minha pergunta é mais em relação ao acréscimo de texto a um resultado de pipe.

    
por Philip Kirkbride 22.04.2017 / 02:00

3 respostas

2

Na mais simples das opções, isso é anexado ao fluxo de canais:

$ echo "750/12.5" | { bc; echo "/24"; }
60
/24

No entanto, isso tem uma nova linha inesperada, para evitar que você precise usar tr:

$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24

Ou, dado o fato de que uma expansão de comando remove as novas linhas:

$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24

Mas provavelmente, a maneira correta deve ser semelhante a:

$ echo "$(echo "750/12.5" | bc )/24"
60/24

Qual, para ser usado em bc, poderia ser escrito assim:

$ bc <<<"$(bc <<<"750/12.5")/24"
2

Qual, para obter uma precisão de número flutuante razoável, deve ser algo como:

$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000

Observe a necessidade de duas escalas, pois há duas instâncias de bc.

É claro que uma instância de bc precisa de apenas uma escala:

$ bc <<<"scale=5;750/12.5/24"

Na verdade, o que você deve pensar é em termos de uma string:

$ a=$(echo "750/12.5")        # capture first string.
$ echo "$a/24" | bc           # extend the string
2

O comentário sobre a escala acima ainda é válido aqui.

    
por 22.04.2017 / 02:58
2

Consegui isso usando sed e substituindo o final da linha:

echo "my text" | sed 's/$/ more text/'

Retorna:

my text more text

Seu exemplo:

echo "750/12.5" | bc | sed 's/$/\/24/' | bc
    
por 04.09.2018 / 09:00
1

Algo parecido com isso parece funcionar usando xargs:

$ echo "750/12.5" | bc |xargs -I{} echo "{}+20" |bc
80

Ou até mesmo:

$ echo "750/12.5" | bc |echo "$(</dev/stdin)+20" |bc
80

E por que não:

$ bc <<<20+$(bc <<<"750/12.5")
80
    
por 22.04.2017 / 02:12