Estou tentando calcular a entropia média dos arquivos contidos em uma pasta usando:
{ 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 sendo um executável que calcula a entropia de Shannon de um arquivo, fornecendo saídas do formulário:
$ entropy foo
foo: 5.13232
O comando acima mencionado erros com:
(standard_in) 1: syntax error
No entanto, a saída gerada parece não ter problemas:
$ { 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
E isso também funciona:
$ echo '(2.1+2.1)/2' | bc -l
2.1
O que há de errado com o comando mencionado?
Você está perdendo uma linha final final para o
—
gniourf_gniourf
bccomando: compare printf '(5.13232+2.479+1.4311+0)/3' | bc -lcom echo '(5.13232+2.479+1.4311+0)/3' | bc -l. (seu tr -d '\n'comando remove a nova linha à direita que bcprecisa).
Uma solução fácil é inserir
—
gniourf_gniourf 23/06
{ cat; echo; }entre o tre o bc: tr -d '\n' | { cat; echo; } | bc -lou substituir a tr -d '\n'peça por:{ tr -d '\n'; echo; }
Use em
—
Stéphane Chazelas
paste -sd'\0' -vez de tr -d '\n'para preservar o último caractere de nova linha. (veja também paste -sd+ -para unir linhas +).
awk? Seria substancialmente mais fácil.