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
bc
comando: comparar printf '(5.13232+2.479+1.4311+0)/3' | bc -l
con echo '(5.13232+2.479+1.4311+0)/3' | bc -l
. (su tr -d '\n'
comando elimina la nueva línea final que bc
necesita).
Una solución fácil es insertar
—
gniourf_gniourf
{ cat; echo; }
entre el tr
y el bc
: tr -d '\n' | { cat; echo; } | bc -l
o 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.