J'essaie de calculer l'entropie moyenne des fichiers contenus dans un dossier en utilisant:
{ 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
étant un exécutable qui calcule l'entropie Shannon d'un fichier, donnant des sorties de la forme:
$ entropy foo
foo: 5.13232
La commande susmentionnée génère des erreurs avec:
(standard_in) 1: syntax error
Cependant, la sortie générée semble n'avoir aucun problème:
$ { 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
Et cela fonctionne aussi:
$ echo '(2.1+2.1)/2' | bc -l
2.1
Quel est le problème avec la commande mentionnée?
awk
? Ce serait beaucoup plus facile.bc
commande: comparerprintf '(5.13232+2.479+1.4311+0)/3' | bc -l
avececho '(5.13232+2.479+1.4311+0)/3' | bc -l
. (votretr -d '\n'
commande supprime la nouvelle ligne de fin qui abc
besoin).{ cat; echo; }
entre letr
et lebc
:tr -d '\n' | { cat; echo; } | bc -l
ou de remplacer latr -d '\n'
pièce par:{ tr -d '\n'; echo; }
paste -sd'\0' -
au lieu detr -d '\n'
pour conserver le dernier caractère de nouvelle ligne. (voir aussipaste -sd+ -
pour joindre des lignes avec+
).Réponses:
Ah, mais avez-vous essayé:
L'utilisation
echo -n
accomplira la même chose - il n'y a pas de fin de ligne, et c'est votre problème.la source
bc
a une syntaxe assez particulière.dc
est moins exigeant:Je pense que cela fait ce que vous essayez de faire, mais je ne suis pas totalement certain. Un échantillon de sortie plus grand qu'une seule ligne serait utile.
la source
dc
pour faire tout le travail aussi:{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc
. Le laid10k[+]sa[z2!>az2!>b]sbzsclbxlc/p
est un tas d'ordure qui indiquedc
de calculer la moyenne des nombres restants sur la pile (avec une échelle de10
):D
.dc
ordure de toute façon - c'est seulement bon d'être laissé dans cette zone de commentaire.