解析和制表结果

时间:2016-09-21 11:00:32

标签: python perl parsing

在Unix系统上解析和制表输出的简单灵活方法是什么?

输出具有以下格式的多个条目:

===================================================== 
======  SOLVING WITH MATRIX small_SPD ====
=================================================== 

sizes: 5,5,8

Solving with Sparse LU AND COLAMD ... 
COMPUTE TIME : 8.9287e-05
SOLVE TIME : 1.0663e-05
TOTAL TIME : 9.995e-05
REL. ERROR : 2.30263e-18


Solving with BiCGSTAB ... 
COMPUTE TIME : 4.113e-06
SOLVE TIME : 1.853e-05
TOTAL TIME : 2.2643e-05
REL. ERROR : 1.34364e-10

ITERATIONS : 2

这应该被列为(或类似):

Matrix      Sizes         Solver             Compute    Solve         Total       Rel Error
small_SPD   5,5,8  Sparse LU AND COLAMD   8.9287e-05   1.0663e-05   9.995e-05   2.30263e-18   
small_SPD   5,5,8        BiCGSTAB          4.113e-06   1.853e-05    2.2643e-05  1.34364e-10

1 个答案:

答案 0 :(得分:1)

如果您只是解析输出,我会像这样解决它:

#!/usr/bin/env perl
use strict;
use warnings;

#set paragraph mode - look for empty lines between records.
local $/ = '';

#init the matrix/size vars. 
my $matrix;
my $sizes;

#output order    
my @columns = ( "COMPUTE TIME", "SOLVE TIME", "TOTAL TIME", "REL. ERROR" );

#Column headings.
print join "\t", "matrix", "sizes", "solver", @columns,"\n";

#iterate the data. 
#note - <> is a magic file handle that reads STDIN or 'files specified on command line'
#that's just like how sed/grep/awk do it. 
while (<>) {
   #find and set the matrix name
   #note conditional - this only appears in the 'first' record. 
   if (m/MATRIX (\w+)/) {
      $matrix = $1;
   }
   #find and set the sizes. 
   if (m/sizes: ([\d\,]+)/) {
      $sizes = $1;
   }
   #multi-line pattern match to grab keys and values. 
   #this then maps neatly into a hash. 
   my %result_set = m/^(\w+).*: ([\d\.\-e]+)/gm;

   #add the solver to the 'set':
   #and use this test to check if this 'record' is of interest. 
   #skipping the "ITERATIONS" line. 
   my ( $solver ) =  m/Solving with (.*) .../ or next;
   #print it tab separated.  
   print join "\t", $matrix, $sizes, $solver, @result_set{@columns}, "\n";
}

输出:

matrix  sizes   solver  Compute Solve   Total   Rel Error   
small_SPD   5,5,8   Sparse LU AND COLAMD    8.9287e-05  1.0663e-05  9.995e-05   2.30263e-18 
small_SPD   5,5,8   BiCGSTAB    4.113e-06   1.853e-05   2.2643e-05  1.34364e-10 

制表符分隔,这可能对某些应用程序很有用 - 但您可能希望改为printfformat