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: Breno Moiana
Subject: Re: [shell-script] Registros multi-linha em arquivo texto, ou Delimitadores de trecho de texto - parte II
Date: Mon, 6 Apr 2009 09:58:44 -0300

Opa, Flavio, obrigado pela resposta!

Infelizmente, estou usando ksh, e o "=~" não pega aqui. Dei uma olhada
na 'bíblia' aqui do lado (o Advanced bash-Scripting guide, do Mendel
Cooper), e não encontrei referência a esse operador. Googling também
não ajudou muito. Por que você está usando isso ao invés de um simples
"=" ? Trocar os "=~"  por "=" nao funcionou, estou debugando seu
script para entender melhor o que está acontecendo under the hood.

Apesar de a solução do jimmy já ter funcionado, acho que entender a
sua e portar pro ksh é um exercício interessante tambem :)

Obrigado mais uma vez!
abraco!

Breno.
--




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