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파일의 Shannon 엔트로피를 계산하는 실행 파일이며 다음 형식의 출력을 제공합니다.

$ 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

생각하다그게 당신이 하려는 일이겠지만, 완전히 확신할 수는 없어요. 한 줄보다 큰 출력 샘플이 도움이 될 것입니다.

관련 정보