[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Comando para eliminar duplicatas não sequenciais
From: |
Marcio Gil |
Subject: |
Re: Comando para eliminar duplicatas não sequenciais |
Date: |
Thu, 12 Nov 2009 12:58:45 -0200 |
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>
>
> >
> >
> > 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.
> >
> >
> >
>
Re: [shell-script] Comando para eliminar duplicatas não sequenciais, Tiago Peczenyj, 2009/11/12
Re: Comando para eliminar duplicatas não sequenciais, Sérgio, 2009/11/13