• Publicidad

Error al juntar dos columnas de dos archivos diferentes

Perl aplicado a la bioinformática

Error al juntar dos columnas de dos archivos diferentes

Notapor CrisPerl » 2018-02-19 12:10 @548

Hola a todos y en especial a explorer por su respuesta rápida de antemano.

Quiero comparar la columna 0 del archivo cath con la columna modificada 1 del archivo 3tpoA2 y si coinciden que agregue la columna 1 del cath al último del archivo modificado 3tpoA2.

Debe quedar así en las filas donde coinciden los id.

3tpoA 3tpoA 30 406 435.00 1.25.10.10 1.25.10.10

Adjunto archivos originales


#!/usr/bin/perl

open (CATH,"./cath_min2.txt");
while ($catch = <CATH>) {
chomp $catch;
@catch=split(/\s+/,$catch);
$id=@catch[0];
$classcatch=join ("\.",@catch[1..4]);
}
open (LOG,"./3tpoA2.log");

while ($log = <LOG>) {
next if $log =~ /^\D/;
chomp $log;
@log=split(/\t/,$log);
@nwlog=@log[0..2, 6, 5];
print "@nwlog[0..$#nwlog]";
foreach $p (@nwlog[1..$#nwlog]) {
if ($p=~/^\d[a-z]{3}[A_Z]/) {
push (@nwlog,$classcatch);
} else {$nwlog[1]="NF"}
} print"\n";
}
Adjuntos
3tpoA2.log
(1.29 KiB) 145 veces
cath_min2.txt
(117 Bytes) 146 veces
CrisPerl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2018-02-04 01:31 @105

Publicidad

Re: Error al juntar dos columnas de dos archivos diferentes

Notapor explorer » 2018-02-19 16:08 @714

Hay que usar hashes para almacenar la información que vamos leyendo, y luego, al leer línea por línea el otro archivo, ver si existe una coincidencia.

Primero guardamos la información del archivo cath en una estructura hash cuyas claves son los id, y los valores son arrays, cuyos elementos son los que siguen a los id.

Segundo, leemos el archivo de log línea a línea. Si existe alguna clave del hash que coincide con el id de la segunda columna, pues pintamos la información de los dos archivos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use strict;
  4. use warnings;
  5. use autodie;
  6.  
  7. my %classcatch;
  8.  
  9. open my $CATH, '<', 'cath_min2.txt';
  10.  
  11. while (my $catch = <$CATH>) {
  12.     chomp $catch;
  13.     my @catch = split " " , $catch;
  14.     $catch[0] =~ s/\d+$//;                      # quitamos los dígitos del final
  15.  
  16.     # guardamos el valor en un array que cuelga de un valor hash
  17.     push @{ $classcatch{ $catch[0] } }, join '.', @catch[1..4];
  18. }
  19.  
  20. close $CATH;
  21.  
  22. #use Data::Dumper;
  23. #say Dumper \%classcatch;                       # aspecto de la estructura creada
  24.  
  25. open my $LOG, '<', '3tpoA2.log';
  26. my $log = <$LOG>;                               # leemos la línea de cabecera
  27.  
  28. while ($log = <$LOG>) {
  29.     chomp $log;
  30.  
  31.     my @log = split /\t/, $log;
  32.  
  33.     if (exists $classcatch{ $log[1] }) {        # si existe un id igual a la segunda columna
  34.  
  35.         say join " ", @log[0 .. 2, 6, 5], @{ $classcatch{ $log[1] } };
  36.     }
  37.     else {
  38.         say "$log[0] no encontrado";
  39.     }
  40. }
  41.  
  42. close $LOG;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
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: Error al juntar dos columnas de dos archivos diferentes

Notapor CrisPerl » 2018-02-20 01:04 @086

Muchas gracias, explorer.

Veo que aun no consigo asimilar bien lo de los hash y sacarle provecho en su uso. ¿Y si se quisiera mantener toda la información de las columnas incluso donde no coincida? Que aparezca, por ejemplo, "no encontrado".

Saludos.
CrisPerl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2018-02-04 01:31 @105

Re: Error al juntar dos columnas de dos archivos diferentes

Notapor explorer » 2018-02-20 10:14 @468

Si no hay ninguna clave que no coincida con lo que estamos buscando, vale con poner un else{} para contemplar el caso de qué hacer cuando no hay ninguna coincidencia. Es lo bueno de los hash: sus claves son únicas.

Ya he modificado el código original para tener en cuenta ese caso.
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: Error al juntar dos columnas de dos archivos diferentes

Notapor CrisPerl » 2018-02-21 04:20 @222

¡gracias, explorer!
CrisPerl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2018-02-04 01:31 @105


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 1 invitado