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

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

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


From: Marcio Gil
Subject: Re: [shell-script] Comando para eliminar duplicatas não sequenciais
Date: Thu, 12 Nov 2009 16:28:26 -0200

> -----Original Message-----
> From: Fabiano Caixeta Duarte
> 
> 2009/11/12 Marcio Gil <address@hidden>:
> >> -----Original Message-----
> >> From: Fabiano Caixeta Duarte
> >>
> >> Uma idéia a ser melhorada:
> >>
> >> TMP=$(mktemp /tmp/tmp.XXXXXX)
> >> sort arquivo | uniq > $TMP
> >> while [ $(wc -l < $TMP) -gt 0 ]; do
> >>   linha=$(grep -m1 -f b arquivo)
> >
> > O que faz esse b? Imagino que você queria dizer:
> >
> >   linha=$(grep -m1 -f $TMP arquivo)
> >
> > Mas mesmo assim não funcionou:
> >
> > [marcio@localhost Cupom]$ grep "Bematech_FI_" !(*~*) | grep -v
> > "DLLPROC\|DLLDEF\|LOAD_PROC" | sed
> >  's/.*\(Bematech_FI_[A-Za-z0-9_]*\).*/\1/' | ~/tmp/teste.sh -
> > "/tmp/tmp.jT3120"
> >
> >
> > sed: -e expression #1, char 0: no previous regular expression
> >
> > sed: -e expression #1, char 0: no previous regular expression
> >
> > sed: -e expression #1, char 0: no previous regular expression
> > ...
> >
> >>   echo $linha
> >>   sed -i "/$linha/d" $TMP
> >> done
> >> rm $TMP
> >>
> >> Se ficar alguma dúvida, eu explico :)
> >>
> >
> > Muito obrigado pelas idéias :-)
> 
> Sim. Na pressa eu acabei não substituindo o 'b' por $TMP.
> 
> Mas você disse que não funciona. Aqui eu estei com o que você
passou
> como modelo de seu arquivo.
> 
> Eu não sei o resultado disto:
> > [marcio@localhost Cupom]$ grep "Bematech_FI_" !(*~*) | grep -v
> > "DLLPROC\|DLLDEF\|LOAD_PROC" | sed
> >  's/.*\(Bematech_FI_[A-Za-z0-9_]*\).*/\1/' | ~/tmp/teste.sh -
> > "/tmp/tmp.jT3120"
> 
> Também não sei o conteúdo de teste.sh, que deve ser o fruto de uma
> alteração do código que enviei. Meu código pede um arquivo chamado
> "arquivo". Isto pode ser facilmente ajustado para receber dados da
> stdin.
> 
> Caso queira enviar um exemplo real dos seus dados, podemos ajustar
o
> código. Entretanto, a idéia do Aurélio e do Thobias lembrada pelo
> Tiago é de longe melhor do que a minha.
> 
> Abraços!
> 

O resultado de

$ grep "Bematech_FI_" !(*~*) | grep -v "DLLPROC\|DLLDEF\|LOAD_PROC"
| sed
 's/.*\(Bematech_FI_[A-Za-z0-9_]*\).*/\1/' >~/tmp/funclst.txt

é isto: http://pastebin.com/mb88c416

E o conteúdo de teste.sh:

#! /bin/bash
TMP=$(mktemp /tmp/tmp.XXXXXX)
sort $1 | uniq > $TMP
while [ $(wc -l < $TMP) -gt 0 ]; do
  linha=$(grep -m1 -f $TMP $1)
  echo $linha
  sed -i "/$linha/d" $TMP
done
rm $TMP

Não funciona se eu tentar utiliza-lo com o pipe (não lê se for da
entrada padrão). Já se eu executar:

$ time ./teste.sh funclst.txt
...
real    0m6.600s

Só para comparar:

$ time awk '{ if (!visto[$0]) { print; visto[$0] = 1; } }'
funclst.txt
...
real    0m0.084s

No entanto este script "teste.sh" não encontrou a função
"Bematech_FI_LeituraXSerial", certamente porque antes existe a
função "Bematech_FI_LeituraX".

Seria interessante resolver esta outra questão: existe uma maneira
de o script ser utilizado com o pipe?




reply via email to

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