Frecuencia de palabras en ADN
Publicado: 2010-12-10 06:44 @322
Estimados compañeros,
Buen día. Hoy recurro a ustedes ante una pregunta producto de mi clase de bioinformática, a la cual no he encontrado la manera de abordarla. El profesor nos pide hacer un script llamado cuentapalabras.pl. Este script debe buscar "palabras" (más bien dicho, "conjunto de bases") de una longitud especificada por el usuario, las cuales están dentro de un archivo de texto. Dicho script debe de tener un "uso: <Tamaño de palabra> <archivo de secuencia>" y una salida:
El tamaño de la palabra debe de ser un número entero mayor a 0, y según el profesor, menor a 12 con el propósito de no comprometer la memoria de la computadora. El archivo de secuencia es un archivo en formato txt con 300 líneas de secuencias de ADN, de 100 bases (A, C, G, T) cada línea. El archivo realmente es pequeño (33 Kb y adjunto a la presente pregunta).
Según el profesor, él creó un script que le permite realizar dicha tarea con palabras de hasta 32 caracteres en un archivo de 3 Gb. Pero, él sabe que es complicado, y solo nos solicita elaborar un script que no contenga el uso de alguna biblioteca de Perl. Finalmente, él recomienda que se realice tal tarea usando solo una subrutina, aunque dice que no es el único método.
Me acerco a ustedes, porque realmente no tengo una idea clara de por dónde empezar. Sé que de principio debo de leer el archivo y asegurarme que se lean todas sus líneas. Gracias a explorer sé que puedo utilizar:
Sé que tal vez usando un hash sería posible almacenar las palabras que el script localice, y mediante alguna expresión obtener su frecuencia. Por ejemplo, se me ocurre usar:
Pero no estoy seguro de cómo indicar al programa que deseo buscar palabras de una determinada longitud (¿usar "for"?). Más aun, ¿se puede realizar esto solo usando una sub-rutina? ¿acaso las sub-rutinas no son una parte de la cual depende una instrucción principal?
¿Me pueden ayudar? ¡Gracias de antemano!
P.S. El profesor está de acuerdo con el uso de los foros. Los considera más enriquecedores que un manual para principiantes.
Buen día. Hoy recurro a ustedes ante una pregunta producto de mi clase de bioinformática, a la cual no he encontrado la manera de abordarla. El profesor nos pide hacer un script llamado cuentapalabras.pl. Este script debe buscar "palabras" (más bien dicho, "conjunto de bases") de una longitud especificada por el usuario, las cuales están dentro de un archivo de texto. Dicho script debe de tener un "uso: <Tamaño de palabra> <archivo de secuencia>" y una salida:
Using text Syntax Highlighting
Palabra Frecuencia
======= ==========
CAATG 1052
AATGA 1426
ATGAC 1170
TGACT 1105
GACTG 781
ACTGA 1148
CTGAT 1468
TGATG 916
======= ==========
CAATG 1052
AATGA 1426
ATGAC 1170
TGACT 1105
GACTG 781
ACTGA 1148
CTGAT 1468
TGATG 916
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
El tamaño de la palabra debe de ser un número entero mayor a 0, y según el profesor, menor a 12 con el propósito de no comprometer la memoria de la computadora. El archivo de secuencia es un archivo en formato txt con 300 líneas de secuencias de ADN, de 100 bases (A, C, G, T) cada línea. El archivo realmente es pequeño (33 Kb y adjunto a la presente pregunta).
Según el profesor, él creó un script que le permite realizar dicha tarea con palabras de hasta 32 caracteres en un archivo de 3 Gb. Pero, él sabe que es complicado, y solo nos solicita elaborar un script que no contenga el uso de alguna biblioteca de Perl. Finalmente, él recomienda que se realice tal tarea usando solo una subrutina, aunque dice que no es el único método.
Me acerco a ustedes, porque realmente no tengo una idea clara de por dónde empezar. Sé que de principio debo de leer el archivo y asegurarme que se lean todas sus líneas. Gracias a explorer sé que puedo utilizar:
Using perl Syntax Highlighting
- use common::sense;
- use File::Slurp;
- -e $fichero or die "ERROR: no encuentro el fichero $fichero\n";
- my $secuencia = read_file($fichero);
- $secuencia =~ s/\s+//g;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sé que tal vez usando un hash sería posible almacenar las palabras que el script localice, y mediante alguna expresión obtener su frecuencia. Por ejemplo, se me ocurre usar:
Using perl Syntax Highlighting
while(<>) {
foreach $palabra (split(' ', $_)) {
$frecuencia{$palabra}++;
}
}
foreach $word (sort keys %frecuencia) {
print "$palabra $frecuencia{$palabra}\n";
}
foreach $palabra (split(' ', $_)) {
$frecuencia{$palabra}++;
}
}
foreach $word (sort keys %frecuencia) {
print "$palabra $frecuencia{$palabra}\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Pero no estoy seguro de cómo indicar al programa que deseo buscar palabras de una determinada longitud (¿usar "for"?). Más aun, ¿se puede realizar esto solo usando una sub-rutina? ¿acaso las sub-rutinas no son una parte de la cual depende una instrucción principal?
¿Me pueden ayudar? ¡Gracias de antemano!
P.S. El profesor está de acuerdo con el uso de los foros. Los considera más enriquecedores que un manual para principiantes.