No se pueden sumar números recibidos de stdin usando bc

No se pueden sumar números recibidos de stdin usando bc

Estoy intentando calcular la entropía promedio de los archivos contenidos en una carpeta 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

entropysiendo un ejecutable que calcula la entropía de Shannon de un archivo, dando resultados de la forma:

$ entropy foo
foo: 5.13232

El comando antes mencionado falla con:

(standard_in) 1: syntax error

Sin embargo, el resultado generado parece no tener 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

Y esto también funciona:

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

¿Qué hay de malo con el comando mencionado?

Respuesta1

Y esto también funciona:echo '(2.1+2.1)/2' | bc -l

Ah, pero ¿lo intentaste?

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

El uso echo -nlogrará lo mismo: no hay una nueva línea final, y ese es su problema.

Respuesta2

bctiene una sintaxis bastante particular. dces menos exigente:

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

Ipensareso hace lo que intentas hacer, pero no estoy totalmente seguro. Sería útil una muestra de salida más grande que una sola línea.

información relacionada