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 Delimitad


From: Flavio Junior
Subject: Re: [shell-script] Registros multi-linha em arquivo texto, ou Delimitadores de trecho de texto - parte II
Date: Fri, 3 Apr 2009 17:28:07 -0300

Hm.. o do jimmy me atentou a uns detalhes:

- A ordem que os campos aparecem
- A falta de algum dos campos...


Então lanço o lixão one-line shell-only v2.0:

while IFS=$'\n' read -r LINHA; do if [[ "$LINHA" =~ "Nome:" ]]; then
NOME="${LINHA/Nome:/}"; elif [[ "$LINHA" =~ "Telefone:" ]]; then
FONE="${LINHA/Telefone:/}"; elif [[ "$LINHA" =~ "E-mail:" ]]; then
MAIL="${LINHA/E-mail:/}";fi; if [[ "$LINHA" =~ "(/exemplo|-----)" ]];
then echo "X: $NOME $FONE $MAIL"; NOME=-; MAIL=-; FONE=-; fi; done
<blah

Ou se preferir: http://rafb.net/p/tdH1kF73.html

E no do Jimmy aqui não aparecia o ultimo campo, então adicionei um FS:

# ao encontrar o separador de fichas processar o hash
/(----|\/exemplo)/ {


Tão ai, duas opçoes já.

--

Flávio do Carmo Júnior aka waKKu

2009/4/3 jimmy <address@hidden>:
> 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]