Я пытаюсь вычислить среднюю энтропию файлов, содержащихся в папке, используя:
{ 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
являясь исполняемым файлом, который вычисляет энтропию Шеннона файла и дает выходные данные в виде:
$ entropy foo
foo: 5.13232
Вышеупомянутые ошибки команды с:
(standard_in) 1: syntax error
Однако сгенерированный вывод, похоже, не имеет проблем:
$ { 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
И это тоже работает:
$ echo '(2.1+2.1)/2' | bc -l
2.1
Что не так с упомянутой командой?
awk
? Было бы существенно проще.bc
команды: сравнитеprintf '(5.13232+2.479+1.4311+0)/3' | bc -l
сecho '(5.13232+2.479+1.4311+0)/3' | bc -l
. (вашаtr -d '\n'
команда удаляет завершающий символ новой строкиbc
).{ cat; echo; }
между иtr
иbc
:tr -d '\n' | { cat; echo; } | bc -l
или заменитьtr -d '\n'
деталь на:{ tr -d '\n'; echo; }
paste -sd'\0' -
вместо того,tr -d '\n'
чтобы сохранить последний символ новой строки. (см. также,paste -sd+ -
чтобы соединить линии с+
).Ответы:
Ах, но вы пробовали:
Использование
echo -n
приведет к тому же - нет завершающего символа новой строки, и это ваша проблема.источник
bc
имеет довольно специфический синтаксис.dc
менее разборчив:Я думаю, что это то, что вы пытаетесь сделать, но я не совсем уверен. Выходная выборка, больше чем одна строка, поможет.
источник
dc
чтобы сделать все работы тоже:{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc
. Уродливая10k[+]sa[z2!>az2!>b]sbzsclbxlc/p
куча мусора, которая говорит,dc
чтобы вычислить среднее число чисел, оставшихся в стеке (со шкалой10
):D
.dc
любом случае, я не могу защищать этот мусор - хорошо, что меня оставляют в этой области комментариев.