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?
awk
? Sería sustancialmente más fácil.bc
comando: compararprintf '(5.13232+2.479+1.4311+0)/3' | bc -l
conecho '(5.13232+2.479+1.4311+0)/3' | bc -l
. (sutr -d '\n'
comando elimina la nueva línea final quebc
necesita).{ cat; echo; }
entre eltr
y elbc
:tr -d '\n' | { cat; echo; } | bc -l
o reemplazar latr -d '\n'
parte con:{ tr -d '\n'; echo; }
paste -sd'\0' -
lugar detr -d '\n'
para preservar el último carácter de nueva línea. (ver tambiénpaste -sd+ -
para unir líneas con+
).Respuestas:
Ah, pero intentaste:
El uso
echo -n
logrará lo mismo: no hay una nueva línea de terminación, y ese es su problema.fuente
bc
tiene una sintaxis bastante particular.dc
es menos exigente:Creo que eso es lo que intentas hacer, pero no estoy totalmente seguro. Una muestra de salida más grande que una sola línea ayudaría.
fuente
dc
para hacer todo el trabajo también:{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc
. Lo feo10k[+]sa[z2!>az2!>b]sbzsclbxlc/p
es un montón de basura que le indicadc
que calcule el promedio de los números que quedan en la pila (con una escala de10
):D
.dc
basura de todos modos, es bueno quedarse en esta área de comentarios.