Sí que veo problemas. Miro varias opciones, y no se me ocurre la idea feliz.
Hay una forma. Se trataría de leer el segundo archivo, y organizar la información en una estructura de varias dimensiones, que facilite la localización del gen, que es al final lo que nos interesa.
Usando el campo Chr como clave, se reduce el espacio de búsqueda a 1/5. Dentro de la clave que nos interesa, tenemos que hacer una búsqueda entre los valores Inicio que nos interesa (los que son mayores o iguales al valor Posición). Y dentro de ellos, buscar los valores finales que nos interesa (los que son menores o iguales a Posición).
En fin, se trata de una estructura tridimensional, compuesta de:
Primera dimensión: un
hash cuyas claves son los valores posibles de Chr.
Segunda dimensión: un
array que contiene los valores Inicio, asociadas al valor de la primera dimensión, ordenados numéricamente.
Tercera dimensión: un
array que contiene los valores Final, asociados a los valores Inicio de la segunda dimensión, ordenados numéricamente.
Como vemos en los ejemplos, los valores de Chr son también numéricos, así que podemos pensar que la primera dimensión puede ser también un
array, por simplificar.
Una vez construida la estructura, recorremos el primer archivo por todas sus líneas, y buscamos por la estructura qué valores son coincidentes.
Pero... puede haber mucha separación entre elementos. Los bucles pueden volverse muy lentos. Y el número de condicionales es casi el mismo, así que otra opción es la de obviar la ordenación de los elementos, y simplemente, buscar por todas las combinaciones.
Usaremos
hash, porque así la construcción de la estructura será muy fácil.
Supongamos un archivo 1 así:
Using text Syntax Highlighting
1 100 0.5
1 300 0.1
2 200 0.3
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
y un archivo 2 así:
Using text Syntax Highlighting
AT1G01020 1 50 350
AT1G01021 1 50 500
AT1G010X0 1 50 300
AT1G010X1 1 50 290
AT1G010X2 1 30 600
AT1G010X3 1 50 600
AT1G010X4 1 200 400
AT1G010X5 2 200 400
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
con este programa:
Using perl Syntax Highlighting
#!/usr/bin/perl
use feature 'say';
use autodie;
#my $dir = '/home/damian/Escritorio/Arrays/';
my $dir = '.';
my $input1 = "$dir/archivo1.txt";
my $input2 = "$dir/archivo2.txt";
my $output = "$dir/salida.txt";
# Procesar el segundo archivo para crear la estructura
my @matrix;
open my $INPUT2, '<', $input2;
while (<$INPUT2>) {
## AT1G01020 1 50 350
my( $gen, $chr, $inicio, $final) = split;
$matrix[$chr]{$inicio}{$final} = $gen; # "Matrix te posee"
}
close $INPUT2;
#use Data::Dumper;
#say Dumper \@matrix;
# Procesar el primer archivo, por líneas
open my $INPUT1, '<', $input1;
open my $SALIDA, '>', $output;
while (<$INPUT1>) {
chomp;
## 1 100 0.5
my( $chr, $posicion, $cuentas) = split;
#say "$chr, $posicion, $cuentas";
for my $inicio ( keys %{ $matrix[$chr] } ) { # recorremos todos los valores de inicio
next if $inicio > $posicion; # saltar al siguiente si $posicion no está dentro
for my $final ( keys %{ $matrix[$chr]{$inicio} } ) { # recorremos los finales asociados a ese $inicio
next if $final < $posicion; # saltar al siguiente si $posición no está dentro
# gen Chr cuentas posición
say $SALIDA join "\t", $matrix[$chr]{$inicio}{$final}, $chr, $cuentas, $posicion
}
}
}
close $INPUT1;
close $SALIDA;
__END__
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
la salida es:
Using text Syntax Highlighting
AT1G01020 1 0.5 100
AT1G01021 1 0.5 100
AT1G010X3 1 0.5 100
AT1G010X0 1 0.5 100
AT1G010X1 1 0.5 100
AT1G010X2 1 0.5 100
AT1G01020 1 0.1 300
AT1G01021 1 0.1 300
AT1G010X3 1 0.1 300
AT1G010X0 1 0.1 300
AT1G010X4 1 0.1 300
AT1G010X2 1 0.1 300
AT1G010X5 2 0.3 200
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Si descomentas las líneas de la salida del Data::Dumper, se muestra el formato que tiene la estructura:
Using text Syntax Highlighting
$VAR1 = [
undef,
{
'50' => {
'350' => 'AT1G01020',
'500' => 'AT1G01021',
'600' => 'AT1G010X3',
'300' => 'AT1G010X0',
'290' => 'AT1G010X1'
},
'200' => {
'400' => 'AT1G010X4'
},
'30' => {
'600' => 'AT1G010X2'
}
},
{
'200' => {
'400' => 'AT1G010X5'
}
}
];
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Prueba a ver. El tiempo consumido debería reducirse a un teórico 1/5 del anterior.