[Rio-pm] extraindo strings de um arquivo

Aureliano Guedes guedes_1000 em hotmail.com
Segunda Junho 4 02:41:08 PDT 2012


Gabriel++, o Andre parece que é da bioinformatica, na bioinformatica ja deparei com problema parecido, e a minha solução superou a marca de 8 linhas, ao passo que apenas com '
push @array, $key unless exists $hash{$key};' você resolveu. Obrigado, acabastes de me ajudar sem eu pedir.
> From: gabriel.vieira em gmail.com
> Date: Mon, 4 Jun 2012 01:57:05 -0300
> To: rio-pm em pm.org
> Subject: Re: [Rio-pm] extraindo strings de um arquivo
> 
> Sort mantém ordenada de acordo com os nomes da chave, não de acordo
> com o momento que as chaves foram criadas.
> 
> Se for isso que você quer, então sim, use. :)
> 
> Dê uma lida no perlfunc do sort para saber como lidar com sort de
> números e de palavras.
> 
> 2012/6/4 André Torres <andretorresrj em gmail.com>:
> > Eu consegui achar uma resposta pra isso e acredito que a melhor forma seria
> > usar o sort para manter as chaves ordenadas.
> > esse foi o link que comenta sobre os valores serem retornados
> > aleatoriamente. http://perldoc.perl.org/functions/keys.html
> >
> > o que vcs acham?
> >
> > Abraço.
> >
> >
> > Em 4 de junho de 2012 00:32, André Torres <andretorresrj em gmail.com>
> > escreveu:
> >
> >> Gabriel e Breno,
> >>
> >> Obrigado pelas respostas super úteis.
> >> Entao, eu fiz as modificações que vcs me sugeriram. O fato de colocar a
> >> hash para ordenar os 2 valores em função do nome foi ótimo, pq ja vou saber
> >> que nomes tiveram mais de duas repetições para "triad" e "binding". Agora,
> >> tenho uma duvida como os valores sao lidos e guardados na hash, pois o meu
> >> output nao sai ordenado pelo nome como no arquivo input. eu fiz algo errado,
> >> ou existe uma forma de deixar a lista ordenada pelos nomes da mesma forma
> >> que o input?
> >> em relação ao resto do codigo, eu cosegui compreender as soluções, exceto
> >> por uma das soluções que o Gabriel deu em relação a ler a nova antiga e a
> >> linha atual.
> >> o código modificado vai no final do texto.
> >>
> >> Muito obrigado.
> >>
> >> André Torres.
> >>
> >>
> >> exemplo de input X output:
> >> input:
> >> name
> >> 32
> >> 45
> >> 65
> >> ...
> >>
> >> output:
> >> name
> >> 65
> >> 32
> >> 45
> >> ...
> >>
> >> ________________________________________________________________________
> >> #!/usr/bin/perl
> >> use strict;
> >> use warnings;
> >>
> >> #my $hmm_name = $ARGV[0];
> >> my @name_seq;
> >> my $line;
> >> #my $linha_atual;
> >> #my $linha_anterior;
> >> my $triad;
> >> my $T;
> >> my $BP;
> >>
> >> my $hmm_name = shift;
> >>
> >> open my $fh, '<', $hmm_name or die "Error: $!";
> >> my %sequencias = ();
> >> while (<$fh>){
> >>    next unless /^Q#/;
> >>    my @name_seq = split /\s+/;
> >>        if ($name_seq[5] eq 'triad' or $name_seq[5] eq 'binding'){
> >>        $triad = $name_seq[-4];
> >>        }
> >>        else{
> >>        print "nao existe triade ou binding poket"; #caso $triad recupere
> >> algum valor diferente de 'triad' ou 'binding'
> >>        }
> >>        $sequencias{$name_seq[2]} .='|***'. $triad; #define $name_seq[2]
> >> como a chave
> >> }
> >>           foreach my $seq (keys %sequencias){ # o valor de cada chave
> >> organizada na hash é passada para a variavel $seq.
> >>           print $seq . $sequencias{ $seq } . "\n"; #imprime a chave e os
> >> campos relacionados a cada uma.
> >>           }
> >> close $fh;
> >> exit;
> >>
> >> ___________________________________________________________________________________
> >>
> >>
> >>
> >>
> >>
> >> Em 2 de junho de 2012 18:34, breno <breno em rio.pm.org> escreveu:
> >>
> >>> Boa Gabriel!
> >>>
> >>> André, usando as dicas dele, que tal a seguinte versão:
> >>>
> >>> ------------------->8-------------------
> >>> my $hmm_name = shift;
> >>>
> >>> open my $fh, '<', $hmm_name
> >>>  or die "Error: $!";
> >>>
> >>> my %sequencias = ();
> >>>
> >>> while (<$fh>) {
> >>>  next unless /^Q#/;
> >>>
> >>>  my @name_seq = split /\s+/;
> >>>
> >>>  my ($name_seq, $triad) = @name_seq[2,5];
> >>>
> >>>  if ($triad eq 'triad' or $triad eq 'binding') {
> >>>    $sequencias{ $name_seq } .= '|' . $name_seq[-4];
> >>>  }
> >>> }
> >>>
> >>> foreach my $seq (keys %sequencias) {
> >>>  print $seq . $sequencias{ $seq } . "\n";
> >>> }
> >>>
> >>> close $fh;
> >>> -------------------8<-------------------
> >>>
> >>> Você consegue entender o que cada parte está fazendo? Isso te atende?
> >>> Preste atenção nas dicas do Gabriel e não deixe de responder se tiver
> >>> alguma dúvida!
> >>>
> >>>
> >>> []s
> >>>
> >>> -b
> >>>
> >>> 2012/6/2 Gabriel Vieira <gabriel.vieira em gmail.com>:
> >>> > 1) Sempre inicie os seus programas com:
> >>> >
> >>> > use strict;
> >>> > use warnings;
> >>> >
> >>> >
> >>> > 2) Use o open com 3 parâmetros:
> >>> >
> >>> > open my $f, '<', $hmm_name or die "Error: $!";
> >>> >
> >>> >
> >>> > 3) Evite usar a variável especial $_, declare uma variável para
> >>> > receber o conteúdo:
> >>> >
> >>> > while ( my $line = <$f> ) {
> >>> >
> >>> > 4) Declare suas variáveis, sempre:
> >>> >
> >>> >      my @name_seq = split /\s+/, $line;
> >>> >      my $name_seq   = $name_seq[2];
> >>> >      my $triad            = $name_seq[5];
> >>> >
> >>> >
> >>> > 5) == é comparador numérico:
> >>> >
> >>> > perl -E 'my $a = "b"; say $a == "a"'
> >>> >
> >>> > Sempre que os dois valores estiverem preenchidos por valores não
> >>> > numéricos irá retornar 1 (verdadeiro).
> >>> >
> >>> >
> >>> > 6) = é atribuição de valor:
> >>> >
> >>> > if ( my $x = "oi" ) { print $x }
> >>> >
> >>> > Sempre irá atribuir o valor do lado direito à variável e validar esse
> >>> > valor. Se for 0 ou undef, será falso, para todas as outras existe
> >>> > mastercard.. ops.. será verdadeiro.
> >>> >
> >>> >
> >>> > 7) Você atribuiu um valor a @T em 2 condições, qual seria o valor de
> >>> > @T caso elas não fossem atendidas?
> >>> >
> >>> >
> >>> > Dito isso, e pedindo ajuda aos monges caso eu tenha escrito alguma
> >>> > besteira, vamos à resposta da sua pergunta.
> >>> >
> >>> > Vejo algumas soluções de imediato:
> >>> >
> >>> > 1) Utilização de HASH, onde o valor em comum às linhas seria a chave:
> >>> >
> >>> > push @{ $hash{">AAEL000511-PA"}, "S327,E453,H567";
> >>> >
> >>> > Claro, isso com as variáveis no lugar das constantes.
> >>> > Isso implica em memória, então você avalia se vale a pena.
> >>> >
> >>> >
> >>> > 2) Utilização de uma variável temporária para armazenar a linha atual
> >>> > e ser lida junto com a próxima:
> >>> >
> >>> > my $linha_anterior;
> >>> >
> >>> > while ( my $linha_atual = <$f> ) {
> >>> >
> >>> >  if ( defined $linha_anterior ) {
> >>> >      print $linha_anterior . $linha_atual;
> >>> >      undef $linha_anterior;
> >>> >   }
> >>> >   else {
> >>> >      $linha_anterior = $linha_atual;
> >>> >   }
> >>> >
> >>> > }
> >>> >
> >>> >
> >>> > 3) Faça nova leitura do stream (mais elegante, IMHO):
> >>> >
> >>> > while ( my $linha_anterior = <$f> ) {
> >>> >   my $linha_atual = <$f>;
> >>> > }
> >>> >
> >>> >
> >>> > 4) Existem outras maneiras...
> >>> >
> >>> >
> >>> > É isso...
> >>> >
> >>> > 2012/6/2 André Torres <andretorresrj em gmail.com>:
> >>> >> oi pessoal,
> >>> >>
> >>> >> estou com uma duvida.
> >>> >>
> >>> >> eu estou extraindo duas colunas de um arquivo texto, mas gostaria de
> >>> >> deixar
> >>> >> elas organizadas em apenas em uma linha e nao em duas como estoa no
> >>> >> arquivo
> >>> >> original. nao sei como fazer para o que eu li na primeira linha ser
> >>> >> colocado
> >>> >> junto o que for lido na segunda.
> >>> >>
> >>> >> ai embaixo vai um exemplo da entrada e da saida que eu estou tendo e a
> >>> >> que
> >>> >> eu queria.
> >>> >>
> >>> >> obrigado.
> >>> >>
> >>> >> input:
> >>> >> Q#1 - >AAEL000511-PA     specific    catalytic triad    S327,E453,H567
> >>> >> 3    3    29383
> >>> >> Q#1 - >AAEL000511-PA     specific    substrate binding pocket
> >>> >> G245,G246,G247,E326,S327,A328,V331,A482,L486,N487,V522,G568,I571    13
> >>> >> 13    29383
> >>> >>
> >>> >> output que estou tendo:
> >>> >> AAEL000511-PA S327,E453,H567
> >>> >> AAEL000511-PA
> >>> >> G245,G246,G247,E326,S327,A328,V331,A482,L486,N487,V522,G568,I571
> >>> >>
> >>> >> output desejado:
> >>> >>>AAEL000511-PA | S327,E453,H567 |
> >>> >>> G245,G246,G247,E326,S327,A328,V331,A482,L486,N487,V522,G568,I571
> >>> >>
> >>> >> codigo:
> >>> >>
> >>> >> open (READ, "$hmm_name") or die ("Error: $!");
> >>> >>
> >>> >> while (<READ>)
> >>> >> {
> >>> >>     if ($_ =~/^Q#/) {
> >>> >>        @name_seq = split (" ", $_);
> >>> >>        $name_seq = $name_seq[2];
> >>> >>        $triad = $name_seq[5];
> >>> >>        }
> >>> >>        if ($triad == "triad"){
> >>> >>        @T = $name_seq[-4];
> >>> >>        }
> >>> >>            elsif ($triad = "binding"){
> >>> >>            @T = $name_seq[-4];
> >>> >>            }
> >>> >> print "@T\n";
> >>> >> }
> >>> >> close (READ);
> >>> >>
> >>> >>
> >>> >>
> >>> >> --
> >>> >> André Torres
> >>> >>
> >>> >> "Quando o homem aprender a respeitar até o menor ser da criação, seja
> >>> >> animal
> >>> >> ou vegetal, ninguém precisará ensiná-lo a amar seu semelhante."
> >>> >> (Albert
> >>> >> Schweitzer - Nobel da Paz de 1952)
> >>> >>
> >>> >> _______________________________________________
> >>> >> Rio-pm mailing list
> >>> >> Rio-pm em pm.org
> >>> >> http://mail.pm.org/mailman/listinfo/rio-pm
> >>> >
> >>> >
> >>> >
> >>> > --
> >>> > Gabriel Vieira
> >>> > _______________________________________________
> >>> > Rio-pm mailing list
> >>> > Rio-pm em pm.org
> >>> > http://mail.pm.org/mailman/listinfo/rio-pm
> >>> _______________________________________________
> >>> Rio-pm mailing list
> >>> Rio-pm em pm.org
> >>> http://mail.pm.org/mailman/listinfo/rio-pm
> >>
> >>
> >>
> >>
> >> --
> >> André Torres
> >>
> >> "Quando o homem aprender a respeitar até o menor ser da criação, seja
> >> animal ou vegetal, ninguém precisará ensiná-lo a amar seu semelhante."
> >> (Albert Schweitzer - Nobel da Paz de 1952)
> >
> >
> >
> >
> > --
> > André Torres
> >
> > "Quando o homem aprender a respeitar até o menor ser da criação, seja animal
> > ou vegetal, ninguém precisará ensiná-lo a amar seu semelhante." (Albert
> > Schweitzer - Nobel da Paz de 1952)
> >
> > _______________________________________________
> > Rio-pm mailing list
> > Rio-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/rio-pm
> 
> 
> 
> -- 
> Gabriel Vieira
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
 		 	   		  
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20120604/1af9e4e3/attachment-0001.html>


Mais detalhes sobre a lista de discussão Rio-pm