• Publicidad

Agrupar resultados de dos archivos

Perl aplicado a la bioinformática

Agrupar resultados de dos archivos

Notapor abejonejo » 2017-12-05 11:06 @504

Hola, estoy comprando los blast de 450 genes de 7 organismos diferentes y quiero agrupar todos los resultados en un único archivo. Tengo dos ficheros para cada organismo, uno con todos los identificadores de los genes que quiero estudiar y otro con los resultados del blast, pero el problema es que si el blast no me da resultado no me pone una línea en blanco y luego agrupar todos los resultados es un poco tedioso si hago cortar y pegar.

Si me podéis dejar un script que me ayude estaría genial. Lo que tengo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Fichero 1       Fichero 2
indet1          Resultado1
ident2          Resultado4
ident3
ident4

Lo que quiero:
ident1       Resultado1
ident2      
ident3
ident4       Resultado4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¡Gracias!
abejonejo
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2017-06-12 12:40 @569

Publicidad

Re: Agrupar resultados de dos archivos

Notapor explorer » 2017-12-05 14:27 @643

Ese es un problema muy común. En estos foros hay docenas de hilos preguntando lo mismo.

La clave es saber cuándo pintar qué cosa a cada lado. Del ejemplo que muestras, ¿cómo sabemos que Resultado4 tiene que ir al lado de ident4? ¿Por que termina en 4?

Una solución es la de meter todos los resultados (archivo 2) en un hash, por ejemplo, y empezar a recorrer las líneas del primer archivo. Para cada línea, imprimimos la primera columna, y luego miramos a ver si existe un resultado en el hash que almacena los resultados, correspondiente a la primera columna. Si es así, imprimimos la segunda columna. Tanto en un caso como en el otro, terminamos el bucle con un carácter de fin de línea.

Algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %resultados;
  2.  
  3. open my $FILE2, '<', "Fichero 2";
  4.  
  5. while (my $resultado = <$FILE2>) {
  6.     chomp $resultado;
  7.     my ($id) = $resultado =~ /(\d+)$/;          # sacamos el último dígito
  8.     $resultados{$id} = $resultado;              # lo guardamos
  9. }
  10.  
  11. close $FILE2;
  12.  
  13. open my $FILE1, '<', "Fichero 1";
  14. open my $SALIDA,'>', "Salida";
  15.  
  16. while (my $ident = <$FILE1>) {
  17.     chomp $ident;
  18.     my ($id) = $ident =~ /(\d+)$/;              # sacamos el último dígito
  19.  
  20.     print $SALIDA $ident;                       # primera columna
  21.  
  22.     if ( exists $resultados{ $id } ) {          # si existe un resultado correspondiente a ese $id
  23.  
  24.         print $SALIDA "\t   $resultados{$id}";  # segunda columna
  25.     }
  26.  
  27.     print $SALIDA "\n";                         # fin de línea
  28. }
  29.  
  30. close $SALIDA;
  31. close $FILE1;
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14075
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Agrupar resultados de dos archivos

Notapor abejonejo » 2017-12-10 16:29 @728

¡Buenas y gracias! Siento la tardanza en responder.

No me ha funcionado, explicaré mejor mi problema.

En el fichero "ID" tengo:

gen2
gen3
gen1
gen4

En el fichero "blast" tengo:

gen1 189 57% 65% 9E-145
gen2 185 59% 69% 9E-45
gen4 181 51% 60% 9E-15

Quiero:

gen2 185 59% 69% 9E-45
gen3 - - - - (los guiones es línea en blanco)
gen1 189 57% 65% 9E-145
gen4 181 51% 60% 9E-15

Básicamente lo que necesito es un grep que me devuelva los resultados en el orden que yo le indico con los identificadores y que si mi identificador no tiene resultado me de una línea en blanco.
abejonejo
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2017-06-12 12:40 @569

Re: Agrupar resultados de dos archivos

Notapor explorer » 2017-12-10 17:48 @783

Bueno, solo he cambiado un poco el código, y ya funciona.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #
  3. my %resultados;
  4.  
  5. open my $FILE2, '<', "blast";
  6.  
  7. while (my $resultado = <$FILE2>) {
  8.     chomp $resultado;
  9.     $resultado =~ s/^(\S+)\s+//;                # sacamos el id de la primera columna, y lo quitamos
  10.     my $id = $1;                                # el id lo capturamos antes con los paréntesis
  11.     $resultados{$id} = $resultado;              # guardamos el resto del resultado
  12. }
  13.  
  14. close $FILE2;
  15.  
  16. open my $FILE1, '<', "id";
  17. open my $SALIDA,'>', "Salida";
  18.  
  19. while (my $ident = <$FILE1>) {
  20.     chomp $ident;
  21.  
  22.     print $SALIDA $ident;                       # primera columna
  23.  
  24.     if ( exists $resultados{ $ident } ) {       # si existe un resultado correspondiente a ese $id
  25.  
  26.         print $SALIDA " $resultados{$ident}";   # segunda columna
  27.     }
  28.  
  29.     print $SALIDA "\n";                         # fin de línea
  30. }
  31.  
  32. close $SALIDA;
  33. close $FILE1;
  34.  
Coloreado en 0.011 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
gen2 185 59% 69% 9E-45
gen3
gen1 189 57% 65% 9E-145
gen4 181 51% 60% 9E-15
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14075
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: Yahoo [Bot] y 0 invitados