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

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

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

entropysendo um executável que calcula a entropia Shannon de um arquivo, fornecendo saídas no formato:

$ entropy foo
foo: 5.13232

O comando mencionado acima apresenta erros com:

(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?

Responder1

E isso também funciona: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 -nresultará na mesma coisa - não há terminação de nova linha, e esse é o seu problema.

Responder2

bctem uma sintaxe bastante particular. dcé menos exigente:

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

EUpensarisso faz o que você está tentando fazer, mas não tenho certeza. Uma amostra de saída maior que uma única linha ajudaria.

informação relacionada