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 <[EMAIL PROTECTED]> > 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: [EMAIL PROTECTED] <fulano%40gmail.com> > > ----- > > Ficha:02 > Nome: Beltrano > Resumo: blabla > Telefone: 44 xxxx-2534 E-mail: [EMAIL PROTECTED] <beltrano%40gmail.com> > > ----- > > Ficha: 03 Nome: Cicrano > Resumo: blabla > Telefone: 44 xxxx-2300 > E-mail: [EMAIL PROTECTED] <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 "[EMAIL > PROTECTED]<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]
