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

[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.
> >
> >  
> >
> 



reply via email to

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