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

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

Re: [shell-script] Delimitadores de trecho de texto


From: Julio C. Neves
Subject: Re: [shell-script] Delimitadores de trecho de texto
Date: Wed, 29 Oct 2008 18:04:25 -0200

Fala Cristiano,
eu acho que é isso que vc quer:

$ grep -E '^(Ficha|Nome|Resumo|Telefone|E-mail):' /arquivo/muito/grande.txt
| sed -r 's/^[A-Za-z-]+: ?//;s/ [A-Za-z-]+: ?/\n/' | xargs -L5

O grep pega somente as linhas que interessam. O sed até o ponto-e-vírgula
mata os títulos, dois-pontos e o espaço (se houver). Caso haja outro título
na mesma linha, o resto do sed se incumbe de trocá-lo por um <enter>.

Nesse momento, todas as fichas estão sem os títulos e cada uma tem 5 linhas.
O xargs serve para torná-las uma única linha.

Isso tudo poderia ser feito somente no sed, mas estava sem saco.
-- 
Abração,
Julio
*Cursos de Shell nos finais de semana:
- Em SP ligue (11) 2125-4747;
- Em DF ligue (61) 3223-3000;
- Turmas fechadas em outras cidades ligue (21) 8112-9988*

2008/10/29 Cristiano Ferrari <address@hidden>

>   Caríssimos, boa tarde.
>
> Preciso importar um grande volume de dados de um arquivo texto imenso e
> possuo um arquivo texto cujo conteúdo quase segue um padrão. O "quase"
> é que me mata.
>
> Pensem em um arquivo com várias fichas, cada uma com vários campos, e
> todas as fichas separadas por um delimitador. Algo do tipo:
>
> <exemplo>
>
> Ficha: 01
> Nome: Fulano
> Resumo: blabla
> Telefone: 44 xxxx-9460
> E-mail: address@hidden <fulano%40gmail.com>
>
> -----
>
> Ficha:02
> Nome: Beltrano
> Resumo: blabla
> Telefone: 44 xxxx-2534 E-mail: address@hidden <beltrano%40gmail.com>
>
> -----
>
> Ficha: 03 Nome: Cicrano
> Resumo: blabla
> Telefone: 44 xxxx-2300
> E-mail: address@hidden <Cicrano%40gmail.com>
>
> </exemplo>
>
> -- detalhe: a quantidade de espaços é literal e proposital
>
> Preciso ler o arquivo e criar uma tabela com os campos FICHA, NOME,
> RESUMO, TELEFONE, EMAIL e o conteúdo de cada ficha nas linhas.
>
> Um dos problemas é que o campo "resumo: blabla" pode ter qualquer
> conteúdo e ir de 0 (não existir) a infinitas linhas.
>
> Outro, é que os campos não são tabulados nem alinhados.
>
> Mais um: nem todo campo está sozinho em uma linha. Como no caso da
> ficha 2, email e telefone estão na mesma linha ou, no caso da ficha 3,
> "ficha" e "nome" estão na mesma linha.
>
> Por fim, os espaços entre
>
> Portanto, tudo o que eu tenho de padrão é
>
> 1. O ":" separa o rótulo do campo do conteúdo do campo
>
> 2. O "-----" separa uma ficha da outra
>
> 3. Em toda a ficha o primeiro campo é "ficha"
>
> Estou tentando desenvolver um algorítimo em shell, usando grep, sed,
> awk ou o que mais for possível que me permita varrer o arquivo e fazer
> a importação.
>
> Identificar os campos e relacionar cada campo ao seu conteúdo é
> relativamente fácil.
>
> A dificuldade está em dizer que o conteúdo 
> "address@hidden<beltrano%40gmail.com>"
> que
> achei e relacionei com o campo "EMAIL" pertence à ficha 02.
>
> Pensei em usar os delimitadores "-----" como marcadores de ficha, onde
> eu localizaria todas linhas com o padrão "ficha : conteúdo" colocando
> o resultado desta pesquisa em um laço onde eu novamente varreria o
> arquivo pegando o conteúdo dele esta ocorrência até o próximo
> delimitador "-----" e, dentro de outro laço, pesquisaria os demais
> campos, já sabendo que eles se referem à ficha tal.
>
> O meu problema está em como fazer para pegar o conteúdo do padrão
> localizado "ficha : conteúdo" até o próximo delimitador "-----" o grep
> me permite retornar uma quantidade X de linhas antes e/ou depois, mas
> esta quantidade varia de acordo com o conteúdo do campo "resumo" que
> pode ocupar várias linhas. Então eu preciso arrumar um jeito de contar
> quantas linhas existem entre a ocorrência do padrão "ficha | conteúdo"
> e a próxima ocorrrência do padrão "-----". Isso implica em varrer o
> arquivo muitas vezes.
>
> Alguém poderia me dar uma idéia de um jeito melhor?
>
>  
>



-- 
Abração,
Julio
Cursos de Shell nos finais de semana:
- Em SP ligue (11) 2125-4747;
- Em DF ligue (61) 3223-3000;
- Turmas fechadas em outras cidades ligue (21) 8112-9988


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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