Hay que cambiar un par de cosas:
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
open( FILE, "secuencias.txt" );
while (<FILE>) {
while ( $_ =~ m/([A-Z]{10,})/g ) {
$sec = $1;
chomp $sec;
ind_sec();
}
}
sub ind_sec {
open( FILE2, "bibliotecas.txt" );
$count = 0;
while ( $sed = <FILE2> ) {
while ( $sed =~ m/$sec/g ) {
$count += 1;
}
}
close(FILE2);
print "$sec $count\n";
}
close(FILE);
exit;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Entonces, la salida es:
Using text Syntax Highlighting
TTGGACTGAAGGGAGCTCCCT 1
AGGCAGCTCTCCTCTGGCAGG 0
TGAAGTGTTTGGGGGAACTC 1
TGCAGTTGCTGCCTCAAGCTT 1
TTTGGAGTGAAGGGAGCTCTG 0
AATGGAGGCTGATCCAAGATC 1
GTGAAGTGTTTGGGGGAACTC 1
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Pero, repito, esto es tremendamente ineficiente. Además, no contemplas el caso de que una secuencia comience dentro de sí misma.
Por ejemplo, si tenemos una secuencia a buscar como
AATAATAATAATAATAATresulta que si la buscamos en
AATAATAATAATAATAATAATAATAATAATAATAATnos dará que la ha encontrado dos veces, que es lo correcto... ¿o quizás no? Realmente, la secuencia se repite siete veces:
Using text Syntax Highlighting
bibli: AATAATAATAATAATAATAATAATAATAATAATAAT
seq_1: AATAATAATAATAATAAT
seq_2: AATAATAATAATAATAAT
seq_3: AATAATAATAATAATAAT
seq_4: AATAATAATAATAATAAT
seq_5: AATAATAATAATAATAAT
seq_6: AATAATAATAATAATAAT
seq_7: AATAATAATAATAATAAT
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
No nos dices si quieres contemplar este caso. Sí, ya sabemos que es casi imposible que se dé, pero...
Este caso es más real: Si buscamos esta secuencia:
GTGAAGTGTGTGAAGTGTGdentro de
GTGAAGTGTGTGAAGTGTGTGAAGTGTGTGAAGTGTG¿Cuál debe ser el resultado? Si lo hacemos con tu expresión regular (/$sec/g), nos dirá que solo aparece una vez. Pero... si la buscamos de forma exhaustiva, ¡aparece tres veces!
Esta es mi solución:
Using perl Syntax Highlighting
#!/usr/bin/perl
use v5.14;
use autodie;
## Leemos las secuencias
my %secuencias;
open my $SECUENCIAS, '<', 'secuencias.txt';
while (my $sec = <$SECUENCIAS>) { # Para todas las secuencias
chomp $sec; # Quitamos el final de línea
$secuencias{$sec} = 0; # Inicializar el contador de aparición
# para cada secuencia
}
close $SECUENCIAS;
## Procesamos el archivo de bibliotecas
open my $BIBLIO, '<', 'bibliotecas.txt';
while (my $linea = <$BIBLIO>) {
my @columnas = split " ", $linea; # Partimos en columnas
my $secuencia_a_mirar = $columnas[1]; # Nos interesa la 2.ª columna
for my $sec (keys %secuencias) { # Para todas las secuencias a buscar
while ($secuencia_a_mirar =~ /$sec/g) { # La buscamos
$secuencias{$sec}++; # Contamos una aparición más
# Reposicionamos (OPCIONAL)
pos($secuencia_a_mirar) = pos($secuencia_a_mirar) - length($sec) + 1;
}
}
}
close $BIBLIO;
## Salida de resultados
while(my($sec, $veces) = each %secuencias) {
say "$sec => $veces";
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La línea que dice OPCIONAL es la que permite hacer una búsqueda exhaustiva, como la del ejemplo que te he puesto. Si crees que no se va a dar ese caso, se puede quitar.
Con un archivo de secuencias como este:
Using text Syntax Highlighting
TTGGACTGAAGGGAGCTCCCT
AGGCAGCTCTCCTCTGGCAGG
TGAAGTGTTTGGGGGAACTC
TGCAGTTGCTGCCTCAAGCTT
TTTGGAGTGAAGGGAGCTCTG
AATGGAGGCTGATCCAAGATC
GTGAAGTGTTTGGGGGAACTC
GTGAAGTGTGTGAAGTGTG
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y con este archivo a analizar (la última línea es la "problemática"
)
Using text Syntax Highlighting
3:1:1619:956 CGGTTGGACTGAAGGGAGCTCCCTTTGGACTGAAGG 40 40 40 40 40 40 18 4 40 34 7 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 N
3:1:1333:1700 GTTGTAGTATAGTGGTAAGTATTCCCGCTGTAGGCA 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 Y
3:1:1745:1406 AATGGAGGCTGATCCAAGATCGTGAAGTGTTTGGGG 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 10 40 3 40 40 40 40 33 40 40 40 40 40 40 40 40 N
3:1:1181:2030 GTCGTCTGTCTTGAAGTGAAGTGTTTGGGGGAACTC 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 10 18 Y
3:1:900:1829 GGTGTTGTGTGTTTTTGCAGTTGCTGCCTCAAGCTT 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 Y
3:1:900:1829 GTGAAGTGTGTGAAGTGTGTGAAGTGTGTGAAGTGTG 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 Y
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
El resultado es:
Using text Syntax Highlighting
AGGCAGCTCTCCTCTGGCAGG => 0
TTGGACTGAAGGGAGCTCCCT => 1
GTGAAGTGTTTGGGGGAACTC => 1
TTTGGAGTGAAGGGAGCTCTG => 0
AATGGAGGCTGATCCAAGATC => 1
TGCAGTTGCTGCCTCAAGCTT => 1
TGAAGTGTTTGGGGGAACTC => 1
GTGAAGTGTGTGAAGTGTG => 3
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Esta solución sigue las mismas ideas que la tuya. Pero sigue siendo menos eficiente que la primera solución que te di, en la que se construye una enorme exp. reg., con lo que se elimina el bucle más interno.