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:52:40 -0300

Valeu, Jimmy, funcionou direitinho aqui!

Tive apenas um problema na ultima linha, porque uso um awk bem cru, no HP-UX :

<error>
ghrbatch *DA4*(33)> awk -f awktest  infile
 syntax error The source line is 31.
 The error context is
                 delete >>>  hash; <<<
 awk: The statement cannot be correctly parsed.
 The source line is 31.
</error>

Pesquisando um pouquinho, vi que o delete para o array inteiro é uma
implementação do gawk, substituível por:

<code>
split("", hash);
</code>

O split zera o array de destino antes de fazer as atribuições, e como
split de null não retorna nada, ele apenas zera o array.

O problema proposto está resolvido, se eu tiver mais alguma duvida
quanto à sua solução, já volto a bola :)

valeu!

Breno.
--

P.S.:
<solucao>
#!/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 nao atrapalhar as proximas comparacoes
# the usage of delete to erase a full array is a gawk extension, not
available in HP-UX's awk.
# delete hash;
split("", hash);
}
</solucao>






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]