• Publicidad

Comparar ficheros

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Notapor explorer » 2009-03-27 07:44 @364

Bueno, pues si las salidas del Dumper te dicen que el programa lee de forma correcta los dos ficheros, lo que queda por saber es qué es lo que debería salir, es decir, ¿qué elementos que ha leído en un fichero y también están en el otro deberían aparecer y no lo hacen?

Con un par de ejemplos podríamos ver qué es lo que puede fallar... pero si no los vemos, poco más podemos decirte.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Notapor m_angeles8 » 2009-03-27 09:33 @439

A ver, por ejemplo, en el fichero genesZfin.tsv aparece este gen:

Código: Seleccionar todo
meis1     11 figure(s) from 5 publications      1-4 somites to Day 4        ZDB-GENE-020122-1



y en el de moddanre.txt aparece este grupo de ortologos,
Código: Seleccionar todo
___________________________________________________________________________________            
Group of orthologs #1637. Best score 773 bits            
Score difference with first non-orthologous sequence - modDANRE.fa:120   modMUSMU.fa:279            
ZDB-GENE-020122-1      100.00%      MGI:104717             100.00%
Bootstrap support for ZDB-GENE-020122-1 as seed ortholog is 99%.            
Bootstrap support for MGI:104717 as seed ortholog is 100%.            
___________________________________________________________________________________   



El identificador ZDB-GENE es el mismo por lo que me debería aparecer en el fichero ortologos.txt, pero sin embargo no aparece.

Otro ejemplo,

genesZfin.tsv:
Código: Seleccionar todo
pabpc4     2 figure(s) from Thisse et al., 2001      20-25 somites to Prim-25        ZDB-GENE-030131-9663


moddanre.txt:
Código: Seleccionar todo
___________________________________________________________________________________            
Group of orthologs #736. Best score 1045 bits            
Score difference with first non-orthologous sequence - modDANRE.fa:232   modMUSMU.fa:230            
ZDB-GENE-030131-9663   100.00%      MGI:2385206            100.00%
Bootstrap support for ZDB-GENE-030131-9663 as seed ortholog is 100%.            
Bootstrap support for MGI:2385206 as seed ortholog is 100%.            
___________________________________________________________________________________            


Tampoco lo guarda, y así unos cuantos más. Sigo viendo que los que me guarda son los que después del último guión del identificador ZDB tienen 3 cifras, los demás no.

¡¡¡¡Gracias!!!!
m_angeles8
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2009-03-26 12:44 @572

Notapor explorer » 2009-03-27 09:42 @446

Al editar tu mensaje, me he dado cuenta de que al final de la línea del fichero genes, hay un espacio en blanco, justo detrás del identificador.

Creo que lo mejor será cambiar la forma de extraer la información: usar una expresión regular que localice palabras que empiecen por ZDB.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor m_angeles8 » 2009-03-27 10:34 @482

¡¡¡¡Ya tengo la solución!!!! ¡¡Creo que de esta manera funciona way!!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use Data::Dumper;

my $file=shift or print " USAGE:  ./ortolog2.pl   genesZfin.tsv   modDANRE.txt\n\n";
my %genzf;
open GENZF, $file or die $!;
while (<GENZF>) {
        if ( not /^FIN/) {
                my @arr=split (/\t/,$_);
                if ($arr[4]=~/(\S+)/) { $arr[4]=$1; }
                $genzf{$arr[4]}="$arr[4]\t$arr[0]\t$arr[2]";
        }
}
close GENZF;

$file=shift;
my %moddan;
open MODDAN, $file or die $!;
while (<MODDAN>) {
        if (/^(ZDB\S+)\s+(100\S+)\s+(\S+)\s+(100\S+)/) {
                $moddan{"$1"}="$1\t$2\t$3\t$4";
        }
}
close MODDAN;

foreach my $x (sort keys %moddan) {
        if ($genzf{$x}) {
                print $moddan{$x},"\n";
        }
}

#print Dumper %genzf;
#print Dumper %moddan;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
m_angeles8
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2009-03-26 12:44 @572

Notapor explorer » 2009-03-27 12:06 @546

Lo que he dicho antes... era un problema de los tabuladores...

Si no sabemos el formato del fichero, pues pasan estas cosas.

De lo que muestras deduzco que en el primer mensaje sobran caracteres en blanco. Y del segundo fichero, que hay caracteres en blanco además de tabuladores.

Con esta versión, cambiamos el análisis de tabuladores por espacios en blanco, que es más general:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use Data::Dumper;

if (@ARGV != 3) {
    die "La linea de ejecución del programa debe ser: ortologos.pl genesZfin.tsv moddanre.txt ortologos.txt\n";
}

my ($fichero_genes, $fichero_moddanre, $fichero_ortologos) = @ARGV;


## Leemos el fichero de genesZfin
my @zfin;

open    GENESZFIN,"<$fichero_genes" or die "No puedo abrir el fichero $fichero_genes\n";
while (<GENESZFIN>) {
    if (/(ZDB\S+)/) {
        push @zfin, $1;
    }
}
close   GENESZFIN;

print Dumper \@zfin;


## Leemos el fichero moddanre
my %idanimala;

open    MODDANRE, "<$fichero_moddanre" or die "No puedo abrir el fichero $fichero_moddanre\n";
while (<MODDANRE>) {
    if (/^ZDB/) {
        my @moddan = split;
        if ($moddan[1] eq '100.00%' and $moddan[3] eq '100.00%') {
            $idanimala{$moddan[0]} = join "\t", @moddan;
        }
    }
}
close   MODDANRE;

print Dumper \%idanimala;


## Búsqueda de coincidencias
open  ORTOLOGOS, ">$fichero_ortologos" or die "No puedo escribir en $fichero_ortologos: $!\n";
for my $gen (@zfin) {
    if ($idanimala{$gen}) {
        print ORTOLOGOS $idanimala{$gen}, "\n";
    }
}
close ORTOLOGOS;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Para el primer fichero, solo miramos si la línea coincide con el patrón /(ZDB\S+)/, que quiere decir que capture cualquier cosa que empiece por ZDB y le sigan caracteres que no sean caracteres en blanco (\S+).

Para el segundo fichero, primero miramos si empieza por ZDB, y si es así, cortamos la línea en 4 partes que sabemos que están separadas por espacios en blanco.

Ahora que ya sabemos el formato de los ficheros, el programa se hace más corto: los chomp() han desaparecido, el split() se ha simplificado...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados