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?
awk
? Seria substancialmente mais fácil.bc
comando: compareprintf '(5.13232+2.479+1.4311+0)/3' | bc -l
comecho '(5.13232+2.479+1.4311+0)/3' | bc -l
. (seutr -d '\n'
comando remove a nova linha à direita quebc
precisa).{ cat; echo; }
entre otr
e obc
:tr -d '\n' | { cat; echo; } | bc -l
ou substituir atr -d '\n'
peça por:{ tr -d '\n'; echo; }
paste -sd'\0' -
vez detr -d '\n'
para preservar o último caractere de nova linha. (veja tambémpaste -sd+ -
para unir linhas+
).Respostas:
Ah, mas você tentou:
O uso
echo -n
fará a mesma coisa - não há nova linha final, e esse é o seu problema.fonte
bc
tem uma sintaxe bem particular.dc
é menos exigente:Eu acho que faz o que você está tentando fazer, mas não tenho certeza. Uma amostra de saída maior que uma única linha ajudaria.
fonte
dc
para fazer todo o trabalho também:{ find . -type f -exec entropy \{\} | sed 's/.*://' ; echo ' 10k[+]sa[z2!>az2!>b]sbzsclbxlc/p'; } | dc
. O feio10k[+]sa[z2!>az2!>b]sbzsclbxlc/p
é um monte de lixo que indicadc
para calcular a média dos números restantes na pilha (com uma escala de10
):D
.dc
lixo de qualquer maneira - só é bom ficar nessa área de comentários.