Gabriel e Breno, muito obrigado pela ajuda. no caso da duplicação de resultados, eu vou precisar manter pq senao vou perder dados. entao eu guardei a sua dica sobre como filtrar os dados duplicados (eu testei e ela funcionou) pra utilizar em outro script. vai ser super útil. =D
eu entendi os passos da variavel temporária, fiz um script e deixei separado com essa estrutura caso eu precise. agora eu preciso pegar os outros scripts que eu fiz e montar um workflow do tipo que a saida de um programa vai ser a entrada do outro. vou quebrar a minha cabeça e qualquer duvida venho pedir ajuda aos mestres. abraço. André Torres. Em 4 de junho de 2012 06:41, Aureliano Guedes <[email protected]>escreveu: > 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: [email protected] > > Date: Mon, 4 Jun 2012 01:57:05 -0300 > > To: [email protected] > > 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 <[email protected]>: > > > 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 <[email protected]> > > > 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 <[email protected]> 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 <[email protected]>: > > >>> > 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 <[email protected]>: > > >>> >> 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 > > >>> >> [email protected] > > >>> >> http://mail.pm.org/mailman/listinfo/rio-pm > > >>> > > > >>> > > > >>> > > > >>> > -- > > >>> > Gabriel Vieira > > >>> > _______________________________________________ > > >>> > Rio-pm mailing list > > >>> > [email protected] > > >>> > http://mail.pm.org/mailman/listinfo/rio-pm > > >>> _______________________________________________ > > >>> Rio-pm mailing list > > >>> [email protected] > > >>> 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 > > > [email protected] > > > http://mail.pm.org/mailman/listinfo/rio-pm > > > > > > > > -- > > Gabriel Vieira > > _______________________________________________ > > Rio-pm mailing list > > [email protected] > > http://mail.pm.org/mailman/listinfo/rio-pm > > _______________________________________________ > Rio-pm mailing list > [email protected] > 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)
_______________________________________________ Rio-pm mailing list [email protected] http://mail.pm.org/mailman/listinfo/rio-pm
