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: Bruno Gunter
Subject: Re: [shell-script] Comando para eliminar duplicatas não sequenciais
Date: Thu, 12 Nov 2009 16:44:17 -0200
User-agent: Thunderbird 2.0.0.23 (X11/20090825)

Tenta o xargs...

Marcio Gil wrote:

> -----Original Message-----
> From: Fabiano Caixeta Duarte
>
> 2009/11/12 Marcio Gil <address@hidden <mailto:marciomgil%40bol.com.br>>:
> >> -----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 <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]