Bash

無法使用 bc 對從 stdin 收到的數字求和

  • March 26, 2017

我正在嘗試使用以下方法計算文件夾中包含的文件的平均熵:

{ 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

上述命令有什麼問題?

這也有效: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將完成同樣的事情——沒有終止換行符,這就是你的問題。

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

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

認為這可以滿足您的要求,但我並不完全確定。大於單行的輸出樣本會有所幫助。

引用自:https://unix.stackexchange.com/questions/138709