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