Não é possível somar números recebidos de stdin usando bc

7

Estou tentando calcular a entropia média dos arquivos contidos em uma pasta usando:

{ echo '('; find . -type f -exec entropy {} \; | \
  grep -Eo '[0-9.]+$' | \
  sed -r 's/$/+/g'; echo '0)/'; 
  find . -type f | wc -l; }  | \
tr -d '\n' | bc -l

entropy sendo um executável que calcula a entropia de Shannon de um arquivo, fornecendo saídas do formato:

$ entropy foo
foo: 5.13232

O comando acima mencionado com erros:

(standard_in) 1: syntax error

No entanto, a saída gerada parece não ter problemas:

$ { echo '('; find . -type f -exec entropy {} \; | \
    grep -Eo '[0-9.]+$' | \
    sed -r 's/$/+/g'; echo '0)/'; \
    find . -type f | wc -l; }  | \
  tr -d '\n'
(5.13232+2.479+1.4311+0)/3

E isso também funciona:

$ echo '(2.1+2.1)/2' | bc -l
2.1

O que há de errado com o comando mencionado?

    
por user2064000 23.06.2014 / 13:36

2 respostas

10

And this works too: echo '(2.1+2.1)/2' | bc -l

Ah, mas você tentou:

echo '(2.1+2.1)/2' | tr -d '\n' | bc -l
(standard_in) 1: syntax error

Usar echo -n realizará a mesma coisa - não há nova linha final e esse é o seu problema.

    
por 23.06.2014 / 13:49
4

bc tem uma sintaxe bastante particular. dc é menos exigente:

find . -type f -exec entropy \{\} + |
sed 's/.*://;N;N;s/\n[^:]*:/+/g;s/+//;s|$| 3/p|' |
dc

Eu penso que faz o que você está tentando fazer, mas eu não estou totalmente certo. Um exemplo de saída maior que uma única linha ajudaria.

    
por 23.06.2014 / 14:04

Tags