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

思考這就是你想要做的,但我不完全確定。大於單行的輸出樣本會有所幫助。

相關內容