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


8

我正在尝试使用以下方法计算文件夹中包含的文件的平均熵:

{ 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

提到的命令有什么问题?


您愿意使用awk吗?会容易得多。
Bernhard 2014年

2
你只是缺少了拖尾底线bc命令:比较printf '(5.13232+2.479+1.4311+0)/3' | bc -lecho '(5.13232+2.479+1.4311+0)/3' | bc -l。(您的tr -d '\n'命令将删除所需的尾随换行符bc)。
gniourf_gniourf 2014年

3
一个简单的解决方法是{ cat; echo; }tr和之间插入bctr -d '\n' | { cat; echo; } | bc -l或将tr -d '\n'零件替换为:{ tr -d '\n'; echo; }
gniourf_gniourf 2014年

3
使用paste -sd'\0' -而不是tr -d '\n'保留最后一个换行符。(另请参见paste -sd+ -使用加入行+)。
斯特凡Chazelas

Answers:


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

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


5

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

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

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


2
您也可以dc用来完成所有工作:{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc。丑陋10k[+]sa[z2!>az2!>b]sbzsclbxlc/p是一堆垃圾,dc用来计算堆栈上剩余数字的平均值(标度为10:D
gniourf_gniourf 2014年

@gniourf_gniourf-那比我好,伙计。回答一下,我将删除我的。
mikeserv 2014年

不,你太棒了!dc无论如何,我不能真正提倡这种垃圾-只留在此评论区域中是件好事。
gniourf_gniourf 2014年

1
@gniourf_gniourf-但是,这非常快。我想学习如何更好地使用它。感谢您的学习材料……
mikeserv 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.