Soy nuevo en Perl y estoy tratando de extraer información específica de un archivo, que se parece a esto:

 Print of   9 heaviest strained elements:    


   Element no   Max strain 
      20004         9.6 % 
      20013         0.5 % 
      11189         0.1 % 
      20207         0.1 % 
      11157         0.1 % 
      11183         0.0 % 
      10665         0.0 % 
      20182         0.0 % 
      11160         0.0 % 


 ==================================================

Me gustaría extraer los números de elemento único (20004, 20013, etc.) y los escriben en un archivo nuevo. La lectura del archivo debe terminar tan pronto como la línea de (=========) se alcanza, ya que hay más números de elemento con el mismo título más adelante en el archivo.
Espero que tenga sentido.
Cualquier consejo muy apreciada!

Ahora tengo este código que me da una lista de los números, de un máximo de 10 en una fila:

my $StrainOut = "PFP_elem"."_$loadComb"."_"."$i";
open DATAOUT, ">$StrainOut" or die "can't open $StrainOut";  # Open the file for writing.

open my $in, '<', "$POSTout" or die "Unable to open file: $!\n";
my $count = 0;

 while(my $line = <$in>) {
  last if $line =~ / ={10}\s*/;
  if ($line =~ /% *$/) {
    my @columns = split "         ", $line;
    $count++;
    if($count % 10 == 0) {
      print DATAOUT "$columns[1]\n";
    }
    else {
      print DATAOUT "$columns[1] ";
    }      
  }
}
close (DATAOUT);
close $in;

Lo que debe cambiar es el «mi @columnas = split…» de la línea. En el momento en que se divide el $de la línea de escalar cada vez que ha ‘9 espacios». Como el número de dígitos de los números de elemento puede variar, esto es una mala manera de extraer los datos. Es posible que acabo de leer de izquierda a derecha, omitiendo todos los espacios y el registro de los números sólo hasta que los números son seguidos por más espacios (de esa manera el valor del porcentaje se omite)?

  • esto parece funcionar: mi @columnas = split(/\s+/,$linea);

5 Comentarios

  1. 1
    #!/usr/bin/perl
    use strict;
    use warnings;
    
    while (<>) {                        # read the file line by line
        if (/% *$/) {                   # if the line ends in a percent sign
            my @columns = split;        # create columns
            print $columns[0], "\n";    # print the first one
        }
        last if /={10}/;                # end of processing
    }
  2. 1

    Un one-liner utilizando flip-flop:

    perl -ne '
      if ( m/\A\s*(?i)element\s+no/.. ($end = /\A\s*=+\s*\Z/) ) {
        printf qq[$1\n] if m/\A\s*(\d+)/;
        exit 0 if $end
      }
    ' infile

    Resultado:

    20004
    20013
    11189
    20207
    11157
    11183
    10665
    20182
    11160
  3. 0
    #!/usr/bin/perl
    use strict;
    use warnings;
    
    while (my $f= shift) {
       open(F, $f) or (warn("While opening $f: $!", next);
       my foundstart=0;
      while(<F>) {
         ($foundstart++, next) if /^\s#Element/;
         last if /\s*=+/;
         print $_ if $foundstart;
      }
      $foundstart=0;
      close(F);
    }
    • Tiene errores de compilación. 1.- Hay una señorita de un paréntesis en el warn instrucción. 2.- Declarar foundstart variable como un escalar con $ y en la siguiente expresión regular, creo que hay un error tipográfico con # lugar *. A continuación, se imprime números, pero los porcentajes demasiado en mi prueba.
  4. 0
    #!/usr/bin/perl
    use strict;
    use warnings;
    
    open my $rh, '<', 'input.txt' or die "Unable to open file: $!\n";
    open my $wh, '>', 'output.txt' or die "Unable to open file: $!\n";
    
    while (my $line = <$rh>) {        
        last if $line =~ /^ ={50}/;
        next unless $line =~ /^ {6}(\d+)/;
        print $wh "$1\n";
    }
    
    close $wh;
  5. 0

    Usted puede hacerlo mediante la ejecución de este one-liner en un shell de comandos.

    *Nix:

    cat in_file.txt | perl -ne 'print "$1\n" if ( m/\s*(\d+)\s*\d+\.\d+/)' > out_file.txt

    En Windows:

    type in_file.txt | perl -ne "print qq{$1\n} if ( m/\s*(\d+)\s*\d+\.\d+/)" > out_file.txt
    • Él quiere dejar de leer el archivo cuando la línea con los iguales signos se alcanzó a pesar de que.
    • El gato es un desperdicio de un proceso. El modificador-n provoca una iteración a través de los nombres de archivo en @ARGV como si los hubiera escrito: aunque (<>) { …

Dejar respuesta

Please enter your comment!
Please enter your name here