> -----Original Message----- > From: Fabiano Caixeta Duarte > > 2009/11/12 Marcio Gil <[email protected]>: > >> -----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: > > > > [mar...@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: > > [mar...@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?
