Saya mencoba menghitung rata-rata entropi file yang terkandung dalam folder menggunakan:
{ 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
menjadi executable yang menghitung entropi Shannon file, memberikan output dari bentuk:
$ entropy foo
foo: 5.13232
Perintah yang disebutkan di atas salah dengan:
(standard_in) 1: syntax error
Namun, output yang dihasilkan tampaknya tidak memiliki masalah:
$ { 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
Dan ini juga bekerja:
$ echo '(2.1+2.1)/2' | bc -l
2.1
Apa yang salah dengan perintah yang disebutkan?
awk
? Akan jauh lebih mudah.bc
perintah: bandingkanprintf '(5.13232+2.479+1.4311+0)/3' | bc -l
denganecho '(5.13232+2.479+1.4311+0)/3' | bc -l
. (tr -d '\n'
perintah Anda menghapus baris tambahan yangbc
dibutuhkan).{ cat; echo; }
antaratr
danbc
:tr -d '\n' | { cat; echo; } | bc -l
atau menggantitr -d '\n'
bagian dengan:{ tr -d '\n'; echo; }
paste -sd'\0' -
alih-alihtr -d '\n'
untuk mempertahankan karakter baris baru terakhir. (lihat jugapaste -sd+ -
untuk bergabung dengan garis+
).Jawaban:
Ah, tetapi apakah Anda mencoba:
Menggunakan
echo -n
akan mencapai hal yang sama - tidak ada penghentian baris baru, dan itu masalah Anda.sumber
bc
memiliki beberapa sintaks yang cukup khusus.dc
kurang pemilih:Saya pikir itu melakukan apa yang Anda coba lakukan, tetapi saya tidak sepenuhnya yakin. Sampel keluaran yang lebih besar dari satu baris akan membantu.
sumber
dc
untuk melakukan semua pekerjaan terlalu:{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc
. Yang jelek10k[+]sa[z2!>az2!>b]sbzsclbxlc/p
adalah sekelompok sampah yang memberitahudc
untuk menghitung rata-rata angka yang tersisa di tumpukan (dengan skala10
):D
.dc
sampah ini — hanya baik dibiarkan di area komentar ini.