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 <[email protected]>: > 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 <[email protected]>: >> 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: ful...@... >>> >>> ----- >>> >>> Ficha:02 >>> Nome: Beltrano >>> Resumo: blabla >>> Telefone: 44 xxxx-2534 E-mail: beltr...@... >>> >>> ----- >>> >>> Ficha: 03 Nome: Cicrano >>> Resumo: blabla >>> Telefone: 44 xxxx-2300 >>> E-mail: cicr...@... >>> >>> </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 ful...@... >>> Beltrano 44 xxxx-2534 - >>> Cicrano 44 xxxx-2300 cicr...@... >>> </saida> >>> >>> E a fonte de exemplo: >>> >>> <exemplo> >>> Ficha: 01 >>> Nome: Fulano >>> Resumo: blabla >>> Telefone: 44 xxxx-9460 >>> E-mail: ful...@... >>> ----- >>> 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: cicr...@... >>> </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." >> ------------------------------ >> >
