shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Extrair campos de tamanho fixo (problema com acentuação)


From: rapha.couto
Subject: Re: Extrair campos de tamanho fixo (problema com acentuação)
Date: Tue, 09 Oct 2012 18:36:54 -0000
User-agent: eGroups-EW/0.82

Só pra constar. Usando a solução com sed demorava cerca de 50 min para fazer a 
extração dos dados. Já com a solução com o gawk a mesma tarefa levou aprox. 15 
segundos.

--- Em address@hidden, "rapha.couto" <rylphs@...> escreveu
>
> É, aqui estou usando a versão 3.1.6.
> 
> Eu contornei com o seguinte código:
> 
> gawk -v FS='' '
> function fields(start, end){
>   str="";
>   for(i=start; i<=end; i++) str=str$i;
>   return str;
> }
> {
>   campo1=fields(1,10);
>   campo2=fields(11,15);
>      ...
> 
>   print campo1...
> }'   arquivo_entrada
> 
> A função fields foi só pra facilitar a impressão dos campos. Sem ele eu teria 
> que fazer campo1=$1$2$3$4$5...
> 
> Ficou bem mais complexo, mas acredito que seja mais rápido do que a solução 
> em sed e não tem o problema com acentuação. Acho que vou ficar com essa 
> solução mesmo.
> 
> Obrigado a todos.
> 
> --- Em address@hidden, Eri Ramos Bastos <bastos.eri@> escreveu
> >
> > Sei não... acho que é bug mesmo:
> > 
> > [0.75][1426] ebastos:/tmp$> echo 'aeiou'|gawk-3.1.5/gawk -v FIELDWIDTHS='1
> > 2 2' -v OFS=',' '{$1=$1; print}'
> > a,ei
> > [0.57][1426] ebastos:/tmp$> echo 'aéiou'|gawk-3.1.5/gawk -v FIELDWIDTHS='1
> > 2 2' -v OFS=',' '{$1=$1; print}'
> > a,é
> > 
> > [0.67][1426] ebastos:/tmp$> echo 'aeiou'|gawk-3.1.6/gawk -v FIELDWIDTHS='1
> > 2 2' -v OFS=',' '{$1=$1; print}'
> > a,ei,ou
> > [0.59][1426] ebastos:/tmp$> echo 'aéiou'|gawk-3.1.6/gawk -v FIELDWIDTHS='1
> > 2 2' -v OFS=',' '{$1=$1; print}'
> > a,é,io
> > 
> > [0.61][1426] ebastos:/tmp$> echo 'aeiou'|gawk-3.1.7/gawk -v FIELDWIDTHS='1
> > 2 2' -v OFS=',' '{$1=$1; print}'
> > a,ei,ou
> > [0.55][1427] ebastos:/tmp$> echo 'aéiou'|gawk-3.1.7/gawk -v FIELDWIDTHS='1
> > 2 2' -v OFS=',' '{$1=$1; print}'
> > a,éi,ou
> > 
> > []'s
> > Eri
> > 
> > 
> > 
> > 2012/10/9 Tiago Peczenyj <tiago.peczenyj@>
> > 
> > > Não é bug, provavelmente é uma variavel de ambiente relacionada ao 
> > > conjunto
> > > de caracteres (como LC_COLLATE, essas coisas) que esta diferente.
> > >
> > > 2012/10/9 Eri Ramos Bastos <bastos.eri@>
> > >
> > > > **
> > > >
> > > >
> > > > Interessante... Parece ser um bug.
> > > >
> > > > -- Ubuntu 10.4:
> > > >
> > > > [0.67][1141] ebastos:~$> echo 'aeiou'|gawk -v FIELDWIDTHS='1 2 2' -v
> > > >
> > > > OFS=',' '{$1=$1; print}'
> > > > a,ei,ou
> > > > [0.74][1141] ebastos:~$> echo 'aéiou'|gawk -v FIELDWIDTHS='1 2 2' -v
> > > > OFS=',' '{$1=$1; print}'
> > > > a,éi,ou
> > > > [0.71][1142] ebastos:~$> gawk --version
> > > > GNU Awk 3.1.8
> > > > Copyright (C) 1989, 1991-2010 Free Software Foundation.
> > > >
> > > > -- CentOS 5.3
> > > >
> > > >
> > > > $ echo 'aeiou'|gawk -v FIELDWIDTHS='1 2 2' -v OFS=',' '{$1=$1; print}'
> > > > a,ei,ou
> > > >
> > > > $ echo 'aéiou'|gawk -v FIELDWIDTHS='1 2 2' -v OFS=',' '{$1=$1; print}'
> > > > a,é,io
> > > >
> > > > $ gawk --version
> > > > GNU Awk 3.1.5
> > > > Copyright (C) 1989, 1991-2005 Free Software Foundation.
> > > >
> > > > 2012/10/9 rapha.couto <rylphs@>
> > > >
> > > >
> > > > > Olá a todos.
> > > > >
> > > > > Estou criando um script o qual deve extrair os dados de um arquivo com
> > > > > campos de tamanho fixo. Estava usando o gawk pra isso. O problema é
> > > que o
> > > > > mesmo se confunde com campos com acentuação.
> > > > >
> > > > > $ echo 'aeiou'|gawk -v FIELDWIDTHS='1 2 2' -v OFS=',' '{$1=$1; print}'
> > > > > a,ei,ou
> > > > >
> > > > > $ echo 'aéiou'|gawk -v FIELDWIDTHS='1 2 2' -v OFS=',' '{$1=$1; print}'
> > > > > a,é,io
> > > > >
> > > > > Parece que ele está contando bytes e não caracteres e como os acentos
> > > > > possuem 2 bytes o resultado não é o esperado. Eu tentei também o cut
> > > mas
> > > > > mesmo com a opção de seleção por caracter não deu certo:
> > > > > $ echo 'aeiou'|cut -b 2-3
> > > > > ei
> > > > >
> > > > > $ echo 'aéiou'|cut -b 2-3
> > > > > é
> > > > >
> > > > > $ echo 'aéiou'|cut -c 2-3 (esse deveria funcionar)
> > > > > é
> > > > >
> > > > > A única solução que eu encontrei foi usar o sed:
> > > > > $ echo 'aéiou'|sed 's/^.\{1\}\(.\{2\}\).*$/\1/'
> > > > > éi
> > > > >
> > > > > Isso resolveu o meu problema. Entretanto, o problema é que essa
> > > solução é
> > > > > extremamente mais lenta do que as primeiras e como o arquivo é grande,
> > > o
> > > > > processo de extração está demorando muito. Alguém conhece uma solução
> > > > mais
> > > > > veloz?
> > > > >
> > > > > Desde já, obrigado!
> > > > >
> > > > >
> > > > >
> > > > > ------------------------------------
> > > >
> > > > >
> > > > > ----------------------------------------------------------
> > > > > Esta lista não admite a abordagem de outras liguagens de programação,
> > > > como
> > > > > perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> > > > > prévio aviso.
> > > > > ----------------------------------------------------------
> > > > > Sair da lista: address@hidden
> > > >
> > > > > ----------------------------------------------------------
> > > > > Esta lista é moderada de acordo com o previsto em
> > > > > http://www.listas-discussao.cjb.net
> > > > > ----------------------------------------------------------
> > > > > Servidor Newsgroup da lista: news.gmane.org
> > > > > Grupo: gmane.org.user-groups.programming.shell.brazil
> > > > >
> > > > > Links do Yahoo! Grupos
> > > > >
> > > > >
> > > > >
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > --
> > > Tiago B. Peczenyj
> > > Linux User #405772
> > >
> > > http://pacman.blog.br
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> > > ------------------------------------
> > >
> > > ---------------------------------------------------------------------
> > > Esta lista não admite a abordagem de outras liguagens de programação, como
> > > perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> > > prévio aviso.
> > > ---------------------------------------------------------------------
> > > Sair da lista: address@hidden
> > > ---------------------------------------------------------------------
> > > Esta lista é moderada de acordo com o previsto em
> > > http://www.listas-discussao.cjb.net
> > > ---------------------------------------------------------------------
> > > Servidor Newsgroup da lista: news.gmane.org
> > > Grupo: gmane.org.user-groups.programming.shell.brazil
> > >
> > > Links do Yahoo! Grupos
> > >
> > >
> > >
> > 
> > 
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]