Ich versuche, die durchschnittliche Entropie der in einem Ordner enthaltenen Dateien zu berechnen, indem ich:
{ 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
Eine ausführbare Datei, die die Shannon-Entropie einer Datei berechnet und die folgenden Ausgaben liefert:
$ entropy foo
foo: 5.13232
Der oben genannte Befehl ist fehlerhaft mit:
(standard_in) 1: syntax error
Die generierte Ausgabe scheint jedoch keine Probleme zu haben:
$ { 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
Und das funktioniert auch:
$ echo '(2.1+2.1)/2' | bc -l
2.1
Was ist los mit dem genannten Befehl?
awk
? Wäre wesentlich einfacher.bc
Befehl: Vergleichenprintf '(5.13232+2.479+1.4311+0)/3' | bc -l
mitecho '(5.13232+2.479+1.4311+0)/3' | bc -l
. (Ihrtr -d '\n'
Befehl entfernt die nachfolgende neue Zeile, diebc
benötigt wird).{ cat; echo; }
zwischen demtr
und dembc
: einzufügentr -d '\n' | { cat; echo; } | bc -l
oder dastr -d '\n'
Teil durch{ tr -d '\n'; echo; }
paste -sd'\0' -
statttr -d '\n'
, um das letzte Zeilenumbruchzeichen beizubehalten. (Siehe auchpaste -sd+ -
, um Linien mit zu verbinden+
).Antworten:
Ah, aber hast du versucht:
Mit
echo -n
wird das Gleiche erreicht - es gibt keine terminierende Newline, und das ist Ihr Problem.quelle
bc
hat eine ziemlich spezielle Syntax.dc
ist weniger wählerisch:Ich denke , das macht das, was Sie versuchen, aber ich bin mir nicht ganz sicher. Ein Ausgabebeispiel, das größer als eine einzelne Zeile ist, würde helfen.
quelle
dc
die ganze Arbeit erledigen :{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc
. Das Hässliche10k[+]sa[z2!>az2!>b]sbzsclbxlc/p
ist ein Haufen Müll, derdc
den Durchschnitt der auf dem Stapel verbleibenden Zahlen berechnet (mit einer Skala von10
):D
.dc
Müll sowieso nicht wirklich befürworten - es ist nur gut, in diesem Kommentarbereich zu bleiben.