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

2
bcコマンドの最後の行が欠落しているだけです:と比較printf '(5.13232+2.479+1.4311+0)/3' | bc -lしてくださいecho '(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

3
paste -sd'\0' -代わりに使用tr -d '\n'して、最後の改行文字を保持します。(でpaste -sd+ -行を結合することも参照してください+)。
ステファンChazelas

回答:


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

私が考えることは、あなたが何をしようとして行いますが、私は完全に一定ではありませんよ。1行よりも大きい出力サンプルが役立ちます。


2
dcすべての作業を行うためにも使用できます{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc。醜い10k[+]sa[z2!>az2!>b]sbzsclbxlc/pdc、スタックに残っている数値の平均を計算するように指示する一連のジャンクです(スケールは10:D
gniourf_gniourf 2014年

@gniourf_gniourf-それは私よりも優れていますね。それを答えにして、私は私のものを削除します。
mikeserv 2014年

いいえ、あなたは素晴らしいです!dcとにかく、私はこのジャンクを本当に主張することはできません。このコメント領域に残されることは良いことです。
gniourf_gniourf 2014年

1
@gniourf_gniourf-でも、すごく速いです。私はそれをよりよく使う方法を学びたいです。教材をありがとう...
mikeserv '06 / 06/23
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.