stdin에서 받은 숫자를 합산하기 위해 bc를 사용할 수 없습니다.

stdin에서 받은 숫자를 합산하기 위해 bc를 사용할 수 없습니다.

다음을 사용하여 폴더에 포함된 파일의 평균 엔트로피를 계산하려고 합니다.

{ 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

생각하다이것이 당신이 하고 싶은 일이지만, 완전히 확신할 수는 없습니다. 한 줄보다 큰 샘플 출력이 도움이 될 것입니다.

관련 정보