bc を使用して stdin から受信した数値を合計できません

bc を使用して stdin から受信した数値を合計できません

以下を使用して、フォルダーに含まれるファイルの平均エントロピーを計算しようとしています。

{ 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

考えるそれはあなたがやろうとしていることを実行しますが、完全には確信がありません。 1 行よりも大きい出力サンプルがあると役立ちます。

関連情報