• Publicidad

función grep() o regex

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

función grep() o regex

Notapor danusol » 2013-05-22 10:56 @497

Hola, estoy cruzando dos listas de datos, buscando las entradas de la primera (unas mil entradas) en la segunda (una base de datos de ~40 millones de entradas).

He pensado que se puede hacer de dos maneras (seguro que se puede hacer de otras...)

-con un grep
grep (/\b$chr\b/, @file2);

o
-con un regex
m/\b$chr\b/;

Tengo tres dudas,

1- ¿es una de las dos búsquedas, grep o regex, más rápida o eficiente computacionalmente que la otra? Busco agilizar al máximo la búsqueda en la base de datos
2- ¿me siguen buscando, tanto el grep como el regex, a lo largo de toda la base de datos después de la primera coincidencia?
3- ¿cómo puedo parar, si el caso anterior fuese cierto, después de la primera coincidencia?

Gracias por vuestra ayuda.

D.
danusol
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2010-04-22 07:08 @339

Publicidad

Re: función grep() o regex

Notapor explorer » 2013-05-22 11:34 @524

Depende de cómo sean los datos, pero otra forma de hacerlo es leer todas las entradas de un archivo y meterlas en un hash, y luego recorrer el otro archivo, comprobando la existencia o no de cada valor, como clave del hash construido antes.

¿Puedes poner un ejemplo de búsqueda y de datos de la base de datos?

Respuestas:
1- grep() extrae todos los elementos coincidentes, así que aplica la expresión regular a todo el array. Mientras, la expresión regular solo se aplica a un elemento cada vez, excepto en el caso de usar Coincidencia inteligente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.10.1;
  2.  
  3. ...;
  4.  
  5. my @base = ("red", "blue", "green");
  6.  
  7. if (@base ~~ /$chr/) {             # aplica la expresión regular a todos los elementos de @base
  8.     say "base contiene $chr";      # y devuelve verdadero si al menos uno de ellos coincide
  9. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
(La coincidencia inteligente está presente desde Perl v5.10. Más información en perlsyn y perlop).

2- en el caso de grep(), sí, porque su misión es la de extraer todos los elementos de @file2 que coincidan con el patrón. En el caso de la expr. reg., como se hace dentro de un bucle, puedes parar el bucle si se da esa circunstancia (encontrar una coincidencia)

3- con un last. También puedes usar

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use List::MoreUtils 'any';
  2.  
  3. my @base = ("red", "blue", "green");
  4.  
  5. if ( any { /\b$chr\b/ } @base ) {
  6.     say "Encontrado $chr en base";
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Re: función grep() o regex

Notapor danusol » 2013-05-23 05:02 @251

Gracias, explorer.

Un trozo de la base de datos es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
chr1     10583   10583   G       A       0.14    rs58108140
chr1     10611   10611   C       G       0.02    rs189107123
chr1     13302   13302   C       T       0.11    rs180734498
chr1     13327   13327   G       C       0.03    rs144762171
chr1     13958   13958   C       1       0.02    .
chr1     13980   13980   T       C       0.02    rs151276478
chr1     30923   30923   G       T       0.73    rs140337953
chr1     46402   46402   C       0TGT    0.0037  .
chr1     47190   47190   G       0A      0.01    .
chr1     51476   51476   T       C       0.01    rs187298206
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y un trozo del archivo de entrada es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
chr10   82033594        82033594        G       A       het     225     117     37
chr10   82034262        82034262        G       A       het     225     231     37
chr10   82034842        82034842        A       G       hom     222     33      37
chr10   82034854        82034854        T       C       hom     222     36      37
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Para hacer la búsqueda tengo que hacer coincidir las dos primeras columnas, que son las posiciones. ¿Esas podrían ser las claves de un hash?
danusol
Perlero nuevo
Perlero nuevo
 
Mensajes: 46
Registrado: 2010-04-22 07:08 @339

Re: función grep() o regex

Notapor explorer » 2013-05-23 05:52 @286

Sí, así es.

La idea es leer uno de los archivos, y meter las líneas en un hash. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (my $linea = <$ARCHIVO1>) {
  2.     my($c1, $c2) = split " ", $linea, 3;       # partimos la $linea en tres partes, y solo nos quedamos con las dos primeras
  3.  
  4.     $hash{"$c1 $c2"} = 1;                      # recordamos la asociación de las dos primeras columnas
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Luego, abres el segundo archivo y vas comprobando si las dos primeras columnas ya existen:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (my $linea = <$ARCHIVO2>) {
  2.     my($c1, $c2) = split " ", $linea, 3;       # partimos la $linea en tres partes, y solo nos quedamos con las dos primeras
  3.  
  4.     if ($hash{"$c1 $c2"}) {                    # ¿existe una clave con esas columnas?
  5.         say "Encontrado";
  6.     }
  7.     else {
  8.         say "No encontrado";
  9.     }
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Mira este hilo: Cruzar dos listas
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


Volver a Básico

¿Quién está conectado?

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