无法使用 bc 对从 stdin 收到的数字求和

use*_*000 9 shell bash 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
Run Code Online (Sandbox Code Playgroud)

entropy 作为计算文件的香农熵的可执行文件,给出以下形式的输出:

$ entropy foo
foo: 5.13232
Run Code Online (Sandbox Code Playgroud)

上述命令出错:

(standard_in) 1: syntax error
Run Code Online (Sandbox Code Playgroud)

但是,生成的输出似乎没有问题:

$ { 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
Run Code Online (Sandbox Code Playgroud)

这也有效:

$ echo '(2.1+2.1)/2' | bc -l
2.1
Run Code Online (Sandbox Code Playgroud)

上面提到的命令有什么问题?

gol*_*cks 12

这也有效: echo '(2.1+2.1)/2' | bc -l

啊,但是你有没有尝试过:

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

使用echo -n将完成同样的事情——没有终止换行符,这就是你的问题。


mik*_*erv 5

bc有一些非常特殊的语法。dc不那么挑剔:

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

认为这可以满足您的要求,但我并不完全确定。大于单行的输出样本会有所帮助。

  • 你也可以使用 `dc` 来完成所有的工作:`{ find . -type f -exec 熵 \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | 直流`。丑陋的 `10k[+]sa[z2!>az2!>b]sbzsclbxlc/p` 是一堆垃圾,它告诉 `dc` 计算堆栈上剩余数字的平均值(规模为 `10` )`:D`。 (2认同)