Невозможно суммировать числа, полученные из stdin, используя bc

Невозможно суммировать числа, полученные из stdin, используя bc

Я пытаюсь вычислить среднюю энтропию файлов, содержащихся в папке, используя:

{ 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

Что не так с упомянутой командой?

решение1

И это тоже работает:echo '(2.1+2.1)/2' | bc -l

Ах, а вы пробовали:

echo '(2.1+2.1)/2' | tr -d '\n' | bc -l
(standard_in) 1: syntax error

Использование echo -nприведет к тому же результату — завершающего символа новой строки не будет, и в этом ваша проблема.

решение2

bcимеет довольно специфический синтаксис. dcменее разборчив:

find . -type f -exec entropy \{\} + |
sed 's/.*://;N;N;s/\n[^:]*:/+/g;s/+//;s|$| 3/p|' |
dc

ядуматьэто делает то, что вы пытаетесь сделать, но я не совсем уверен. Выходной образец больше одной строки помог бы.

Связанный контент