Я пытаюсь вычислить среднюю энтропию файлов, содержащихся в папке, используя:
{ 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
Что не так с упомянутой командой?
Вам просто не хватает конечного конца
—
gniourf_gniourf
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).
Простое решение - вставить
—
gniourf_gniourf
{ 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+ -чтобы соединить линии с +).
awk? Было бы существенно проще.