• Publicidad

Ayuda con substr

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

Ayuda con substr

Notapor asegurac » 2009-01-20 04:43 @238

Hola qué tal, estoy haciendo un script para que lea un archivo para leer varios archivos de texto, de los cuales solo un par de columnas me interesa extraer.

Espero ser explicito y no confundirlos.

Podría utilizar "split" y después seleccionar las columnas. Sin embargo, en algunos casos el orden de las columnas cambia, por lo que en algunos casos mi script podría fallar. Por tal motivo he decido utilizar "substr", ya que lo espacios entre caracteres son siempre los mismos. A continuación coloco como ejemplo solo una parte del archivo del cual necesito extraer la información (los archivos son mucho más grandes).

Código: Seleccionar todo
COMPND   2 MOLECULE: DIHYDROPTEROATE SYNTHETASE;                                                                               .
SOURCE   2 ORGANISM_SCIENTIFIC: STAPHYLOCOCCUS AUREUS                                                                          .
AUTHOR    D.KOSTREWA,C.OEFNER,A.D'ARCY                                                                                         .
  515  4  0  0  0 TOTAL NUMBER OF RESIDUES, NUMBER OF CHAINS,                 .
 21660.0   ACCESSIBLE SURFACE OF PROTEIN (ANGSTROM**2)                                                                         .
  386 75.0   TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(J) 
   72 14.0   TOTAL NUMBER OF HYDROGEN BONDS IN     PARALLEL BRIDGES,
    0  0.0   TOTAL NUMBER OF HYDROGEN BONDS IN ANTIPARALLEL BRIDGES,
    0  0.0   TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I-5)
    0  0.0   TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I+1)
   38  7.4   TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I+2)
   66 12.8   TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I+3)
  190 36.9   TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I+4),
   12  2.3   TOTAL NUMBER OF HYDROGEN BONDS OF TYPE O(I)-->H-N(I+5),
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22
  0  0  0  1  2  0  1  3  2  1  0  0  3  1  2  0  1  1  0  1  0  1      .
  2  2  2  6  4  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
  0  0  0  0  0  0  0  2  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  #  RESIDUE AA STRUCTURE BP1 BP2  ACC     N-H-->O    O-->H-N     
   *1    2 A   T
   *2    3 A   K
   *3    4 A   T
   *4    5 A   K   **E
   *5    6 A   I   **E
   *6    7 A   M   **E
   *7    8 A   G   **E
   *8    9 A   I   **E
   *9   10 A   L   **E
   10   11 A   N   **E
   11   12 A   V
   12   13 A   T
   13   14 A   P   **G
   14   15 A   D   **G
   15   16 A   S   **G
   16   17 A   F


Lo que quiero hacer es que el script inicie leyendo a partir de donde la línea comienza con "# RESIDUE" y que inicie la extracción a partir de la siguiente línea. De manera que extraiga la columna que inicia con el número "2" y la columna que tiene espacios vacíos y las letras "E" y "G". Para ello, he escrito el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#! /usr/bin/perl -w

$filename = $ARGV[0];
open(FILE, $filename) || die "¡Error!\n\n";

while (<FILE>) {

    if(/^\  #/)
    {
        $bfactorP = substr($_,7,4);
        $bfactorL = substr($_,17,1);
        print "$bfactorP\t$bfactorL\n";
    }
}
close FILE;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Mi problema es que el script empieza a extraer a partir de la línea que inicia con "# RESIDUE" y no sé cómo decirle que comience a extraer a partir de la siguiente línea.

¿Alguien sabe cómo hacerlo?
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Publicidad

Notapor explorer » 2009-01-20 05:58 @290

Podrías obviar las líneas que no te interesan...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<FILE>) {

    next if 1 .. /^  #/;

    my $bfactorP = substr($_, 7,4);
    my $bfactorL = substr($_,17,1);

    print "$bfactorP\t$bfactorL\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en perlop, Range operators.
Última edición por explorer el 2009-01-20 07:32 @355, editado 1 vez en total
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

Notapor asegurac » 2009-01-20 06:17 @304

¡¡¡¡Excelente!!!! Muchas gracias por tu respuesta.
asegurac
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2008-10-31 05:52 @286

Notapor Jenda » 2009-01-20 19:26 @851

¿Cómo se llama este formato o qué programa le produce? Casi seguro que hay módulos que pueden leer ese formato en CPAN ya. Busque en http://search.cpan.org

O visite http://www.bioperl.org/ , hay muchos artículos, módulos y scripts para bioinformáticos con Perl.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor elnico » 2009-02-06 06:47 @324

Perdonen pero tengo curiosidad por saber qué significa esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if(/^\  #/)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Saludos y gracias.
elnico
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2007-09-09 14:44 @656

Notapor explorer » 2009-02-06 07:45 @365

Pues es un if, que mira a ver si la expresión que le sigue es cierta o no.

La expresión es una expresión regular, que busca patrones que coincidan con aquello que empieza (^) por una serie de caracteres en blanco (dos), y seguidos por el carácter #. Si la variable por defecto ($_) coincide con ese patrón, entonces el if se activa.

Es lo mismo que si lo hubiéramos escrito como

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $_ =~ m/^  #/ )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero, algo más abreviado.
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 0 invitados