[Rio-pm] extraindo strings de um arquivo

André Torres andretorresrj em gmail.com
Domingo Junho 3 20:47:36 PDT 2012


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)
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20120604/9e67a203/attachment-0001.html>


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