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 chỉ thiếu một dòng cuối cho
—
gniourf_gniourf
bc
lệnh: so sánh printf '(5.13232+2.479+1.4311+0)/3' | bc -l
vớ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 bc
cần theo dõi).
Một cách khắc phục dễ dàng là chèn
—
gniourf_gniourf
{ cat; echo; }
giữa tr
và bc
: tr -d '\n' | { cat; echo; } | bc -l
hoặc thay thế tr -d '\n'
phần bằng:{ tr -d '\n'; echo; }
Sử dụng
—
Stéphane Chazelas
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 +
).
awk
? Sẽ dễ dàng hơn đáng kể.