Estoy tratando de 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
entropy siendo un ejecutable que calcula la entropía de Shannon de un archivo, dando salidas de la forma:
$ entropy foo
foo: 5.13232
El comando mencionado se equivoca con:
(standard_in) 1: syntax error
Sin embargo, la salida generada 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?
Solo le falta una línea final final para el
—
gniourf_gniourf
bccomando: comparar printf '(5.13232+2.479+1.4311+0)/3' | bc -lcon echo '(5.13232+2.479+1.4311+0)/3' | bc -l. (su tr -d '\n'comando elimina la nueva línea final que bcnecesita).
Una solución fácil es insertar
—
gniourf_gniourf
{ cat; echo; }entre el try el bc: tr -d '\n' | { cat; echo; } | bc -lo reemplazar la tr -d '\n'parte con:{ tr -d '\n'; echo; }
Use en
—
Stéphane Chazelas
paste -sd'\0' -lugar de tr -d '\n'para preservar el último carácter de nueva línea. (ver también paste -sd+ -para unir líneas con +).
awk? Sería sustancialmente más fácil.