Unir dos tablas
Publicado: 2014-01-11 21:54 @954
¿Qué tal? Tengo dos tablas en forma de tabulador y tengo que unirlas para reunir la información de ambas tablas en un solo archivo. Una de las columnas es el ID de la proteína y utilizo el ID para comparar las líneas de las dos tablas; si son iguales entonces imprimo las columnas de ambas tablas.
Funciona si solo quiero las que existen, pero también me interesa que las que no existan se imprima el ID y las columnas de la primera tabla además de otra indicación que diga "no hit"; esta segunda parte es la que no logro hacer funcionar en mi programa.
Este es mi código:
gracias, espero puedan ayudarme.
Funciona si solo quiero las que existen, pero también me interesa que las que no existan se imprima el ID y las columnas de la primera tabla además de otra indicación que diga "no hit"; esta segunda parte es la que no logro hacer funcionar en mi programa.
Este es mi código:
Using perl Syntax Highlighting
- #!/usr/local/bin/perl.
- # Este programa compara un id de una lista con el de una segunda lista, si el ID es igual entonces imprime las variables que tu desees
- # funciona para dos listas y los archivos se pueden usar sin importar el lugar (1.txt vs 2.txt o bien 2.txt vs 1.txt)
- # uso:
- # perl extract_filas_lista.pl file1 file2
- # output: lista.txt
- use strict;
- my $file1 = $ARGV[0]; # ingresa un archivo que se llamara file1
- my $file2 = $ARGV[1]; # ingresa un archivo que se llamara file2
- #use Tie::IxHash; # este módulo es el que permite almacenar la lista en el hash
- #tie my %filas, 'Tie::IxHash'; # manteniendo el orden en el que fue ingresado
- my %filas;
- my $n = 0;
- my $numero1;
- my @b;
- open( LISTA, "$file1" ) || die("No puedo abrir $file1\n");
- #open (RAS, ">lista2.txt") || die ("no puedo abrir secuencias.fasta\n");
- while ( my $linea = <LISTA> ) {
- chomp($linea);
- #if ($linea =~ /(\w+\-\d+)/){
- if ( $linea =~ /(\d+)/ ) {
- chomp($linea);
- @b = split( /\t/, $linea ); # este patrón se puede cambiar para adaptarse a tus necesidades
- $numero1 = $b[0];
- $filas{$numero1} = 0;
- $n++;
- #print RAS "Ta-$numero1\n";
- #print "$numero1\n";
- }
- }
- close(LISTA);
- open( LISTA2, "$file2" ) || die("No puedo abrir $file2\n");
- open( RES, ">iguales.txt" ) || die("no puedo abrir secuencias.fasta\n");
- # tie my %filas2, 'Tie::IxHash';
- my %filas2;
- my $n1 = 0;
- my $numero1;
- my $var1;
- my $var2;
- my @a;
- my $iguales = 0;
- while ( my $linea = <LISTA2> ) {
- chomp($linea);
- #if ($linea =~ /gi/){
- if ( $linea =~ /(\d+)/ ) {
- #if ($linea =~ /(\w+\-\d+)/) { # este patrón se puede cambiar para adaptarse a tus necesidades
- my @a = split( /\t/, $linea );
- $var1 = $a[0];
- $var2 = $a[1];
- $filas2{$var1} = $linea;
- $n1++;
- #print ("$var1\n");
- #print ("$var2\n");
- if ( exists $filas{ $a[0] } ) {
- #print "$filas{$a[0]}\n";
- #print RES "$a[1]\t$var1\n";
- $iguales++;
- #print "$b[0]\t$b[1]\t$b[2]\t$b[3]\t$b[4]\t$b[5]\t$b[6]\t$a[2]\t$a[3]\t$a[4]\t$a[5]\t$a[6]\n";
- print RES "$b[0]\t$b[1]\t$b[2]\t$b[3]\t$b[4]\t$b[5]\t$b[6]\t$a[2]\t$a[3]\t$a[4]\t$a[5]\t$a[6]\n";
- #print "$linea\n";
- }
- unless ( exists $filas{ $a[0] } ) {
- print "$b[0]\t$b[1]\t$b[2]\t$b[3]\t$b[4]\t$b[5]\t$b[6]\t$a[2]\t$a[3]\t$a[4]\t$a[5]\t$a[6]\n";
- }
- }
- }
- print "\t\tRESULTADOS\n";
- print "tienes $n ID en tu lista $ARGV[0]\n";
- print "Se identificaron $iguales ID de la lista $ARGV[0] en la lista $ARGV[1]\n";
- close(LISTA);
- close(RES);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
gracias, espero puedan ayudarme.