[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Registros multi-linha em arquivo texto, ou Delimitado
From: |
jimmy |
Subject: |
Re: [shell-script] Registros multi-linha em arquivo texto, ou Delimitadores de trecho de texto - parte II |
Date: |
Fri, 3 Apr 2009 17:15:38 -0300 |
User-agent: |
Mutt/1.4.2.3i |
On Fri, Apr 03, 2009 at 03:51:54PM -0300, Breno Moiana wrote:
> Boa tarde, lista.
>
> Algum tempo atrás, rodou na lista um estudo de caso [1] sobre um
> arquivo texto que continha registros que precisavam ser reorganizados.
>
> [1] http://br.groups.yahoo.com/group/shell-script/message/27782
>
>
> A estrutura do arquivo era a seguinte:
>
> <exemplo>
>
> Ficha: 01
> Nome: Fulano
> Resumo: blabla
> Telefone: 44 xxxx-9460
> E-mail: fulano@...
>
> -----
>
> Ficha:02
> Nome: Beltrano
> Resumo: blabla
> Telefone: 44 xxxx-2534 E-mail: beltrano@...
>
> -----
>
> Ficha: 03 Nome: Cicrano
> Resumo: blabla
> Telefone: 44 xxxx-2300
> E-mail: Cicrano@...
>
> </exemplo>
>
> O objetivo era reestruturar o arquivo em colunas de NOME, RESUMO, EMAIL, etc.
> Isso foi atingido com algumas propostas diferentes. Sed, Awk, grep+paste...
>
> A minha pergunta é:
> E como poderíamos fazer se os campos viessem embaralhados?
> Sempre teriamos um separador de registros, mas a ordem dos campos nao
> necessariamente é a mesma, e outros campos podem entrar.
>
> Proposta: extrair "NOME, EMAIL, TELEFONE" dos registros no arquivo texto
> abaixo.
> Note que os campos nao se repetem, e que um dos registros nao contem
> email, devendo retornar vazio. vamos estipular um "-" nesse caso.
> Entao, saída esperada:
>
> <saida>
> Fulano 44 xxxx-9460 fulano@...
> Beltrano 44 xxxx-2534 -
> Cicrano 44 xxxx-2300 Cicrano@...
> </saida>
>
> E a fonte de exemplo:
>
> <exemplo>
> Ficha: 01
> Nome: Fulano
> Resumo: blabla
> Telefone: 44 xxxx-9460
> E-mail: fulano@...
> -----
> Nome: Beltrano
> Ficha:02
> Resumo: blabla
> Nome da mãe: Maria
> Telefone: 44 xxxx-2534
> -----
> Resumo: blabla
> Telefone: 44 xxxx-2300
> Ficha: 03
> Nome: Cicrano
> Comida favorita: jabá com jerimum
> E-mail: Cicrano@...
> </exemplo>
>
> Ideias?
>
> abraco,
>
> Breno.
> --
saudações breno,
fiz um script bem simples em awk, espero que lhe ajude a resolver o
problema
#!/usr/bin/awk -f
BEGIN {
FS = ": +";
nf = split("Nome,Telefone,E-mail", campos, /,/);
}
/:/ {
# carregar o hash de valores para tratamento posteiror
hash[$1] = $2;
}
# ao encontrar o separador de fichas processar o hash
/----/ {
for ( i = 1; i <= nf; i++ ) {
ORS = ( i != nf ) ? "\t" : "\n";
if ( hash[campos[i]] ) {
print hash[campos[i]];
}
else {
print "-";
}
}
# apagando o hash para não atrapalhar as próximas comparações
delete hash;
}
--
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------