> -----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?