Không thể tổng số nhận được từ stdin bằng bc


8

Tôi đang cố gắng tính toán entropy trung bình của các tệp có trong một thư mục bằng cách sử dụng:

{ 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 là một tệp thực thi có thể tính toán entropy của Shannon của một tệp, đưa ra kết quả đầu ra của biểu mẫu:

$ entropy foo
foo: 5.13232

Các lỗi lệnh đã nói ở trên với:

(standard_in) 1: syntax error

Tuy nhiên, đầu ra được tạo ra dường như không có vấn đề:

$ { 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

Và điều này cũng hoạt động:

$ echo '(2.1+2.1)/2' | bc -l
2.1

Điều gì là sai với lệnh được đề cập?


Bạn có sẵn sàng sử dụng awk? Sẽ dễ dàng hơn đáng kể.
Bernhard

2
Bạn chỉ thiếu một dòng cuối cho bclệnh: so sánh printf '(5.13232+2.479+1.4311+0)/3' | bc -lvới echo '(5.13232+2.479+1.4311+0)/3' | bc -l. ( tr -d '\n'lệnh của bạn loại bỏ dòng mới bccần theo dõi).
gniourf_gniourf

3
Một cách khắc phục dễ dàng là chèn { cat; echo; }giữa trbc: tr -d '\n' | { cat; echo; } | bc -lhoặc thay thế tr -d '\n'phần bằng:{ tr -d '\n'; echo; }
gniourf_gniourf

3
Sử dụng paste -sd'\0' -thay vì tr -d '\n'để bảo tồn ký tự dòng mới cuối cùng. (xem thêm paste -sd+ -để tham gia dòng với +).
Stéphane Chazelas

Câu trả lời:


12

Và điều này cũng hoạt động: echo '(2.1+2.1)/2' | bc -l

À, nhưng bạn đã thử chưa:

echo '(2.1+2.1)/2' | tr -d '\n' | bc -l
(standard_in) 1: syntax error

Việc sử dụng echo -nsẽ hoàn thành điều tương tự - không có dòng mới chấm dứt và đó là vấn đề của bạn.


5

bccó một số cú pháp khá đặc biệt. dcít kén chọn hơn:

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

Tôi nghĩ đó là những gì bạn đang cố gắng làm, nhưng tôi không hoàn toàn chắc chắn. Một mẫu đầu ra lớn hơn một dòng sẽ giúp.


2
Bạn có thể sử dụng dcđể làm tất cả các công việc quá : { find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc. Xấu xí 10k[+]sa[z2!>az2!>b]sbzsclbxlc/plà một đống rác dcđể tính trung bình của các số còn lại trên ngăn xếp (với tỷ lệ 10) :D.
gniourf_gniourf

@gniourf_gniourf - điều đó tốt hơn tôi, anh bạn. Làm cho nó một câu trả lời và tôi sẽ xóa của tôi.
mikeerv

Không, của bạn là tuyệt vời! Tôi thực sự không thể ủng hộ thứ dcrác rưởi này dù chỉ là tốt trong khu vực bình luận này.
gniourf_gniourf

1
@gniourf_gniourf - Mặc dù vậy, nó khá nhanh điên rồ. Tôi muốn học cách sử dụng nó tốt hơn. Cảm ơn tài liệu học tập ...
mikeerv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.