shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Re: Comando para eliminar duplicatas não sequenciais


From: Julio C. Neves
Subject: Re: [shell-script] Re: Comando para eliminar duplicatas não sequenciais
Date: Thu, 12 Nov 2009 13:53:18 -0200

Sendo que o cat teste em todos os testes que vc fez era desnecessário. Em
nenhum caso precisava/deveria ter sido usado. Experimente p. ex. fazer:

$ time sort -u teste | wc -l

Abraços,
Julio
Cursos de Shell e Zenity em 2 fins de semana?
- Em SP ligue (11) 2125-4747 Curso de 07 a 11/12;
- Em DF ligue (61) 3223-3000;
- No RJ ligue (21) 2561-0867. Curso nos dias 5,6,12,13/12;
- Turmas fechadas em outras cidades ligue (21) 8112-9988.


2009/11/12 Marcio Gil <address@hidden>

>
>
> Bem interessante essas funções zz... dá para tirar muitas idéias.
>
> De qualquer forma eu testei as várias idéias para ver qual é a mais
> eficiente. Eu juntei parte do meus códigos fonte em um único arquivo
> de quase 100000 linhas e testei várias alternativas:
>
> $ time cat teste | uniq | wc -l
> 93601
> real 0m0.869s
>
> $ time cat teste | sort -u | wc -l
> 36070
> real 0m0.540s
>
> (estes dois só para comparar)
>
> $ time cat teste | cat -n | sort -k2 -u | sort -n | cut -f2- | wc -l
> 36070
> real 0m1.638s
>
> (excelente! funciona muito bem)
>
> $ time cat teste | awk '{ if (!visto[$0]) print; visto[$0] = 1; }' |
> wc -l
> 36070
> real 0m0.652s
>
> (esta dica enviada pelo colega Rafael Almeida)
>
> $ time cat teste | first | wc -l
> 36067
> real 0m54.531s
>
> (como eu faço busca sequencial, já era de se esperar. Talvez melhore
> se eu utilizar árvore ou hash)
>
> $ time cat teste | sed "G ; /^\([^\n]*\)\n\([^\n]*\n\)*\1\n/d ; h ;
> s/\n.*//" | wc -l
> ^C
> real 4m52.727s
>
> (não tive paciência e dei CTRL+C)
>
> Pena que não funcionou com a idéia do Fabiano.
>
> Muito obrigado a todos.
>
> > -----Original Message-----
> > From: Tiago Peczenyj
> >
> > Muito pertinente essa duvida: existem varias formas de
> > conseguir o que vc
> > quer sem apelar para algoritmos iterativos, loops, etc,
> > apenas com bash
> > 'puro' e pipes - e alguma criatividade.
> >
> > O que vc quer ja existe no funçõesZZ [ http://funcoeszz.net/
> > ] do Aurelio &
> > Thobias sob o nome de zzuniq e vou disponibilizar o codigo tal
> qual vc
> > encontra no site
> >
> > # As linhas do arquivo são numeradas para guardar a ordem
> original
> > cat -n "${1:--}" | # Numera as linhas do arquivo
> > sort -k2 -u | # Ordena e remove duplos, ignorando a
> numeração
> > sort -n | # Restaura a ordem original
> > cut -f2- # Remove a numeração
> >
> >
> > o ${1:--} é para ler tanto da stdin quanto de um arquivo.
> >
> > No mesmo fonte vc encontra este comentario:
> >
> > # Versão SED, mais lenta para arquivos grandes, mas só
> > precisa do SED
> > # PATT: LINHA ATUAL \n LINHA-1 \n LINHA-2 \n ... \n LINHA #1
> \n
> > # sed "G ; /^\([^\n]*\)\n\([^\n]*\n\)*\1\n/d ; h ; s/\n.*//"
> $1
> >
> > Boa sorte com o debug :)
> >
> > 2009/11/11 Marcio Gil <address@hidden <marciomgil%40bol.com.br>>
> >
> > >
> > >
> > > Pessoal, quero saber se existe algum comando equivalente ao
> 'uniq'
> > > mas que possa eliminar duplicatas não sequenciais. Exemplo:
> > >
> > > ddeeff
> > > aabbcc
> > > aabbcc
> > > gghhii
> > > gghhii
> > > aabbcc
> > >
> > > com 'cat ... | uniq' fica:
> > >
> > > ddeeff
> > > aabbcc
> > > gghhii
> > > aabbcc
> > >
> > > com 'cat ... | sort -u' fica:
> > >
> > > aabbcc
> > > ddeeff
> > > gghhii
> > >
> > > Mas quero obter somente a primeira ocorrência de cada linha, na
> > > ordem em que elas ocorrem:
> > >
> > > ddeeff
> > > aabbcc
> > > gghhii
> > >
> > > Há muito tempo eu escrevi um código pra fazer isso ( que chamei
> de
> > > 'first': http://c.pastebin.com/f69cecb13 ), mas gostaria de
> saber se
> > > existe alguma maneira de resolver com shel-script padrão.
> > >
> > > Obrigado.
> > >
> > > Marcio Gil.
> > >
> > >
> > >
> >
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]