Página 1 de 2

Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 12:40 @569
por xtr1985
Hola, necesito un programa de Perl que saque por pantalla (sin repetición) los nombres de las especies representadas en un fichero.

El fichero es así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
>TPC2_XENTR Xenopus tropicalis
AAGTGACCGTAGACCAAAGCGAGTTTCGGCTCCAGGGAAGCGAGTTTCGGCTCCAGGGAAGCGAGTTTCGGCTCCAGGG
>TPC2_XENLA Xenopus laevis
ATGGAGTCGGAGCCGCTGCTCGGTTGGAGCGTCAATCTGCCTTGGAGAAAAGCGAGTTTCGGCTCCAGGG
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que me interesa es que imprima sin repetición solo el nombre (ej: Xenopus tropicalis)

Muchas, muchas, gracias.

No sé si es muy simple, pero lo necesito lo más rápido posible. Gracias.

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 12:57 @581
por explorer
Esto es lo que debes hacer:

* abres el fichero
* un bucle por todas las líneas. Para cada línea:
* si la línea no comienza por '>', pasa a la siguiente (por ejemplo, con next)
* quita el carácter de fin de línea con chomp()
* Extraer el nombre de la secuencia. Por el ejemplo, es a partir de la segunda palabra, así que puedes usar split() para dividir la línea en palabras, descartar la primera y quedarte con lo demás
* Metes el nombre de secuencia en un hash, como la clave. Como valor, no importa (lo normal, un '1')
* Fin del bucle
* Inicias otro bucle que recorra las claves del hash
* Por cada uno, lo imprimes en pantalla
* Fin del bucle
* Profit!

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 13:00 @583
por xtr1985
¿Y esto en formato script? Gracias

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 13:02 @585
por explorer
¿No sabes realizar ninguno de los pasos anteriores?

Inténtalo. Te ayudaremos con los fallos que encontremos.

¡Adelante!

P.D. En el foro de Bioinformática hay algunos problemas parecidos, ya resueltos.

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 13:06 @587
por xtr1985
Si me pudieras dar éste, porque es el inicio y estoy estancado y no lo sé hacer, a partir de aquí ya me espabilaría yo... Me harías un gran favor. Gracias igualmente por lo dado...

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 13:13 @592
por xtr1985
¿no? Siento ser pesado...

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 13:40 @611
por explorer
Pero si en otras ocasiones has presentado programas mucho más complejos que el que pides...

A ver... mira...

Abrir un fichero: open()
Bucle: while()
Si no empieza por '>' pasa a la siguiente: next if ! /^>/;
Quita el fin de línea: chomp()
Sacar la secuencia: (undef, @secuencia) = split " "; $secuencia = join '', @secuencia;
Meterlo en el hash: $hash{$secuencia} = 1;
Fin del bucle
Bucle por las claves: for (keys %hash)
Imprime: print

¡Ya está!

En otros hilos se dan ejemplos de lectura de ficheros en formato FASTA.

Quizás alguno de los novatos que visitan estos foros se anime a escribirlo.

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 15:44 @697
por wanako
Siempre hay algún novato dando vueltas :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my %especies;
  7. my $archivo = 'fila.txt';
  8.  
  9. open DATOS, $archivo || die "$!\n";
  10.  
  11. while (<DATOS>) { $especies{$1} = 1 if /^>\w+\s+(.+)/;  }
  12.  
  13. close DATOS;
  14.  
  15. for ( keys %especies ) { print "$_\n"; }
  16.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 15:54 @704
por explorer
Muy buena solución, simplificando el split()/join() con una expresión regular...

Lo que no me gusta es el '||' en el open(). Es mejor usar 'or', por el tema de la precedencia.

Como ejercicio, queda hacer esto mismo, pero eliminando el bucle de la línea 15.

Re: Sacar nombres de especies sin repetición

NotaPublicado: 2011-01-26 16:48 @741
por wanako
Ups perdón, fue un rápido copy/paste :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my %especies;
  7. my $archivo = 'fila.txt';
  8.  
  9. open DATOS, $archivo or die "$!\n";
  10.  
  11. while (<DATOS>) { $especies{$1} = 1 if /^>\w+\s+(.+)/; }
  12.  
  13. close DATOS;
  14.  
  15. print map { "$_\n" } keys %especies;
  16.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más compacto, por el lado del uso de ciclos de CPU debe ser similar, ¿ahorramos unos valiosos bytes de memoria tal vez? :D