[Rio-pm] extraindo strings de um arquivo

Gabriel Vieira gabriel.vieira em gmail.com
Domingo Junho 3 21:57:05 PDT 2012


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


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