2016-09-21 84 views
-3

什么是一种简单而灵活的方式来解析和制表输出,如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 
+2

那么你是如何在这里建立你的结果的? – KeepCalmAndCarryOn

+0

使用标准'str'方法(如'.split','.strip'和'.startswith')很容易在Python中执行此操作。如果您遇到问题,请发布您的代码并解释您遇到的具体问题,我们将帮助您解决问题。 –

+1

@ PM2Ring是的,但正如下面的答案所示,在perl中有一种更好,更灵活的方法,这正是我所寻找的。我没有问过怎么做,但最简单和最灵活的方法是什么。 –

回答

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代替。

+0

thx,这正是我所寻找的,因为它非常灵活并且易于扩展到其他情况 –