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

[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."
------------------------------


reply via email to

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