无法使用 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

思考这就是你想要做的,但我不完全确定。大于单行的输出样本会有所帮助。

相关内容