• Publicidad

Contar los códigos a partir de un archivo en otro

Perl aplicado a la bioinformática

Contar los códigos a partir de un archivo en otro

Notapor dbustos » 2012-01-11 10:00 @458

Hola, estoy intentando escribir un pequeño script para contar las veces que aparece el código de un gen (a partir de una lista en un archivo) en otro archivo, pero, obviamente, no lo logro.

archivo 1
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Mnk1_iso2
Mnk2
Mos
MPSK1
MRCKa
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

archivo 2
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Mnk1_iso2,P3455
Mnk1_iso2,P3455
Mnk2,P3455
Mnk1_iso2,P3455
Mos,P3455
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El resultado debería ser
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Mnk1_iso2 3 veces
MnK1 1 vez
Mnk2 1 vez
Mos  1 vez
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Tengo un script pero es copia y modificación de otros que encontré en este foro...

Espero que me puedan ayudar.
Gracias
Diego
dbustos
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-12-21 10:07 @463

Publicidad

Re: Contar los códigos a partir de un archivo en otro

Notapor explorer » 2012-01-11 10:07 @463

Bienvenido a los foros de Perl en español, dbustos.

Estaría bien que nos dijeras a qué código te refieres, o mejor aún, que nos muestres tu código, para ver en dónde está el fallo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar los códigos a partir de un archivo en otro

Notapor dbustos » 2012-01-11 12:27 @561

Aquí va:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::Slurp;
  3.  
  4. my @archivo_uno = read_file('Salida.txt');
  5.  
  6. open( MYINPUTFILE, "<Kinase.txt" );
  7. while (<MYINPUTFILE>) {
  8.     my ($line) = $_;
  9.     chomp($line);
  10.     for my $linea (@archivo_uno) {
  11.         my $seq = ( split ",", $linea )[0];
  12.         my $pos = 0;
  13.         my $n   = 0;
  14.  
  15.         $n++ while $pos = 1 + index( $seq, $line, $pos );
  16.  
  17.         print "ENCONTRADO $n VECES ($line) EN EL ARCHIVO.\n";
  18.     }
  19. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-01-11 18:57 @831, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
dbustos
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-12-21 10:07 @463

Re: Contar los códigos a partir de un archivo en otro

Notapor explorer » 2012-01-12 07:21 @348

Debes utilizar la técnica de los hash: lees el primer fichero y lo almacenas en un hash. Luego vas analizando el segundo, y los propios hash te van diciendo si está o no, y cuántas veces.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use autodie;
  6. use File::Slurp;
  7.  
  8. my @archivo_uno = read_file('Salida.txt', chomp => 1);          # leemos el archivo, quitando los avances de línea
  9. my %archivo_uno = map { $_ => 0 } @archivo_uno;                 # lo pasamos a un hash
  10.  
  11. my %nuevos;                                                     # guardará códigos que no están en el primer archivo
  12.  
  13. open my $archivo_dos_fh, "<Kinase.txt";
  14. while (<$archivo_dos_fh>) {                                     # leemos el segundo archivo, línea a línea
  15.     my $codigo = (split /,/)[0];                                # nos quedamos con la primera parte
  16.  
  17.     if (defined $archivo_uno{$codigo}) {                        # si coincide con alguno del primer archivo
  18.         $archivo_uno{$codigo}++;                                #   le sumamos una aparición más
  19.     }
  20.     else {                                                      # si no, es un código desconocido
  21.         $nuevos{$codigo}++;                                     #   sumamos una aparición más
  22.     }
  23. }
  24. close $archivo_dos_fh;
  25.  
  26. # Recuento de los encontrados:
  27. # Bucle por todos los códigos de @archivo_uno,
  28. # ordenados según el valor numérico de sus valores (las veces que aparecieron), de forma inversa (de más a menos)
  29. print "Recuento:\n";
  30. for my $codigo (sort { $archivo_uno{$b} <=> $archivo_uno{$a} }  @archivo_uno) {
  31.     print "$codigo $archivo_uno{$codigo} veces\n";
  32. }
  33.  
  34. # Códigos no reconocidos:
  35. my @nuevos = keys %nuevos;                                      # les contamos
  36. if (@nuevos) {                                                  # si hay alguno...
  37.     print "Códigos nuevos:\n";
  38.     for my $codigo (sort { $nuevos{$b} <=> $nuevos{$a} } @nuevos) {     # sacamos todos, ordenados numéricamente
  39.         print "$codigo $nuevos{$codigo} veces\n";
  40.     }
  41. }
  42.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Si estás seguro de que no va a haber códigos nuevos, puedes quitar toda la parte referida a %nuevos y @nuevos.

El tema principal es que estamos usando los hash para guardar el número de veces que aparece cada código, y no un doble bucle para hacer comparaciones, mucho más lento.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Contar los códigos a partir de un archivo en otro

Notapor dbustos » 2012-01-14 10:02 @459

Funciona genial. Jamás lo hubiese podido hacer solo. ¡¡Muchas gracias!!
dbustos
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-12-21 10:07 @463


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado