[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Re: direcionando blocos de textos p/ outro arquivo
From: |
Tiago Barcellos Peczenyj |
Subject: |
Re: [shell-script] Re: direcionando blocos de textos p/ outro arquivo |
Date: |
Wed, 8 Aug 2007 21:45:26 -0300 |
dgotek
Agora sim ficou mais claro
awk -v fulano="pereira" 'BEGIN{ RS=". "
IGNORECASE=1
}
match($0,"[^,. ]*"fulano"[^,]*, C.N.P.J."){
print "nome encontrado: "substr($0,RSTART,RLENGTH-10)
print "registro completo:"
print $0
print "----------------------------------------------"
}' dados
Vejamos linha a linha:
- tenho uma variavel chamada fulano, que vai ser o nome do cliente que eu
procuro (estou com falta de imaginação)
- defino que o separador de registros é um ponto seguido por cinco espaços
- para cada registro eu vou verificar se eu encontro uma expressão regular
composta de 3 pedaços
"[^,. ]*" -> qualquer caracter que não seja espaço em branco, virgula ou
ponto, de 0 a N vezes
fulano -> pedaço do nome literal
"[^,]*, C.N.P.J." -> qualquer quantidade de caracteres que não seja virgula,
seguido de ", C.N.P.J"
Na verdade eu deveria escrever C\.N\.P\.J\. mas... IMHO dificilmente esta ER
vai casar com outra coisa
- quando eu encontro eu pego a substring entre RSTART com tamanho RLENGTH-10
Q diabos é isso?
* RSTART é a posição onde o match encontrou a expressão regular
* RLENGTH é o tamanho da string encontrada,
* pra retirar o ', C.N.P.J' eu diminuo 10
Se vc não precisa do nome encontrado, ignore esta parte. RSTART e RLENGTH
são variaveis globais setadas pela função match.
Agora é customizar e adaptar ao seu problema. Acho que cobri boa parte dos
casos que vc descreveu.
[]´s
Tiago
On 8/8/07, dgotek <address@hidden> wrote:
>
> >
> > awk -F \, -v padrao="palavra_a_ser_encontrada" 'BEGIN{ RS=";" } $0 ~
> > padrao{print $1}'
> >
> > entretanto o seu arquivo possui um formato que pra mim não ficou
> claro,
> > afinal o que diferencia cada registro ? é um tamanho fixo de
> caracteres?
>
> é o nome do cliente, o que separa cada registro é a quantidade de
> espaço depois do ponto final, que 5 a 9 espaços, até começar o outro
> registro.
> são registros, que na verdade são boletins/memorandos de entrega de
> mercadorias.
>
> ex.
>
> Joaquim Pereira da Silva, C.N.P.J.: 54.897.987/0001-58, data da saída
> da mercadoria 25/06/2006, pela transportadora ultradevagar, data da
> entrega da mercadoria 12/07/2006. Quantidade de Volumes 45, Peso
> Bruto 200.
>
> as vezes o nome do cliente vem no meio do registro.
>
> Data da saída da mercadoria 25/06/2006, pela transportadora
> ultradevagar, data da entrega da mercadoria 12/07/2006.Joaquim
> Pereira da Silva, C.N.P.J.: 54.897.987/0001-58, Quantidade de Volumes
> 45, Peso Bruto 200.
>
> > com esse comando que vc me passou consigo separar só o nome. Na
> verdade eu tenho que separar por bloco, como vc observar no exemplo,
> acima, eu teria que pegar da coluna 1, linha 1, até que o espaço do
> bloco fosse maior que 5;
>
> obrigado + uma vez
> >
> > >
> > > > >
> >
>
>
>
--
Tiago B Peczenyj
Linux User #405772
http://peczenyj.blogspot.com/
[As partes desta mensagem que não continham texto foram removidas]