Fala Jeferson,
- Não me pergunte se dá para fazer em Shell, pq d. A pergunta é: "qual a
melhor maneira de fazer em shell?"
Essa frase eu sempre digo, e na nossa lista tem pelo menos uns 200 ex-alunos
meus que podem comprovar isso.
Por isso, adorei a sua observação. Veio a confirmar o que sempre digo... Vc
propôs uma solução e eu duas. Qdo vc falou que estava lenta fui analisá-la
pq estava usando bash puro. Aí fui dar uma olhada no que escrevi e notei que
estava com um cmd test no escopo de um for, que fazia quase 3000 laços (de
um a mil com 3 algarismos cada) e o substituí, gerando o seguinte script:
Tudo=$(eval echo {$1..$2}) # Recebe os num. entre $1 e $2
Tudo=${Tudo// /} # Tira os brancos gerados pelo cmd
anterior
for ((i=0; i<${#Tudo}; i++))
{
let Algarismo[${Tudo:i:1}]++ # Incrementa vetor do algarismo
}
for ((i=0; i<=9; i++))
{
printf "Algarismo %d = %2d\n" \
$i ${Algarismo[$i]:-0} # Se o elemento for vazio, lista zero
}
Agora está Bash puro, mas continua lento pra chuchu. Pesquisei e descobri
que Tudo=${Tudo// /} é muuuuito lento, apesar de ser bash (realmente não
entendi pq). Aí, resolvi deixar os pudores de lado e fazer o menor prg
possível, e fiz o seguinte:
Tudo=$(eval echo {$1..$2})
Tudo=$(sed 's/ //g;s/\([0-9]\)/\1\n/g' <<< $Tudo)
sort -n <(echo "$Tudo") | uniq -c
Se fosse possível, gostaria que vc medisse os tempos de todas as soluções
propostas (inclusive a sua) e postasse na lista.
Abraços,
Julio
Cursos de Shell e Zenity em 2 fins de semana?
- Em SP ligue (11)2125-4747;
- Em DF ligue (61) 3223-3000;
- Turmas fechadas em outras cidades ligue (21) 8112-9988.
2010/1/16 lordhulk <[email protected]>
>
>
> Olá Julio,
> Poxa, infelizmente só achei essa sua resposta entrando direto no forum. Por
> algum motivo nao recebi por e-mail...
>
> A sua idéia funcionou perfeitamente.
> Poderia dar uma destrinchada pra eu aprender esse conceito, pq ficou mt
> interessante.
> A única coisa que notei foi que o desempenho da sua idéia não foi mt legal
> quando feito com grandes valores.
> Fiz um benchmark entre os 2 meios:
>
> No que eu fiz, testando de 1 a 1000, o resultado foi:
> real 0m0.369s
> user 0m0.328s
> sys 0m0.028s
>
> No seu primeiro, testando de 1 a 1000, o resutado foi:
> real 0m0.818s
> user 0m0.660s
> sys 0m0.152s
>
> No seu segundo, testando de 1 a 1000, o resutado foi:
> real 0m12.227s
> user 0m12.041s
> sys 0m0.184s
>
> qual o motivo de tanta diferença, se eu usei sed, tr e seq e vc usou
> printf, echo e sed e o resto todo apenas de builtins do bash?
>
> Abraços
>
>
>
[As partes desta mensagem que não continham texto foram removidas]
------------------------------------
---------------------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de programação, como
perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio
aviso.
---------------------------------------------------------------------
Sair da lista: [email protected]
---------------------------------------------------------------------
Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil
Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/shell-script/
<*> Para sair deste grupo, envie um e-mail para:
[email protected]
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html