2009-04-22 15 views
1

我有一個具有以下值的文件的內:計算從空間數值分隔的文本文件,一個範圍內的行

for 3 threads: 
Average time taken for API1 is: 19097.7 nanoseconds. 
Average time taken for API2 is: 19173.1 nanoseconds. 
Average time taken for API2 is: 19777.7 nanoseconds. 
Average time taken for API2 is: 19243.1 nanoseconds. 
Average time taken for API1 is: 19737.7 nanoseconds. 
Average time taken for API2 is: 19128.1 nanoseconds. 
for 5 threads: 
Average time taken for API1 is: 19097.7 nanoseconds. 
Average time taken for API2 is: 19173.1 nanoseconds. 
Average time taken for API2 is: 19777.7 nanoseconds. 
... 

祝計算1API線和2API線的總和,和總結他們。 另一個要求是,我也想分開計算每個線程。有沒有辦法使用perl,sed,awk或shell腳本來做到這一點?

我目前得到的是什麼:

cat result | grep API1 | awk {'print $7'} 

回答

2

您可以使用grep的組合連接的awk。 grep選擇只有數據的行(在API所在的位置)和awk進行計數。

grep API file | awk '{ arr[$5]+=$7 } END {for (i in arr) {print i,arr[i]} } ' - 

(與文件名更改文件或刪除從標準輸入讀取)

如果要計算不同的總和,你可以做到這一點

awk '{ if($1 == "for") id = $2; else arr[id $5]+=$7 } END {for (i in arr) {print i,arr[i]} } ' testfile 

輸出:

5API1 19097.7 
5API2 38950.8 
3API1 38835.4 
3API2 77322 
0

短而難以理解:

perl -lane 'END{&h}sub h{print"\t$_ => $h{$_}"for keys%h;%h=()}&h,print,next if/^for/;$h{$F[4]}+=$F[6]' data 

可讀,但必須是一個腳本:

#!/usr/bn/perl 

use strict; 
use warnings; 

my %counts; 
my $thread = "undefined"; 
while (<>) { 
    if (/^for ([0-9]+)/) { 
     $thread = $1; 
     next; 
    } 
    my ($item, $time) = /for (\S+) is: (\S+) nano/; 
    $counts{$thread}{$item} += $time; 
} 

for my $thread (sort { $a <=> $b } keys %counts) { 
    print "for $thread threads:\n"; 
    for my $item (sort keys %{$counts{$thread}}) { 
     print "\t$item => $counts{$thread}{$item}\n"; 
    } 
} 
+0

嗨,這不符合爲給定的不同線程數提供不同的總和的要求。 – gagneet 2009-04-22 06:53:32

0

我不明白你的最後一個要求(有沒有指定線程),但我會得到你的信息的設置和滿足要求我可以瞭解。數據被分解,所以你可以得到它。儘管我不明白你如何使用'for x threads:'這一行,但它至少可以被捕獲,所以你可以使用它。

use List::Util qw<sum>; 

my $fh = FileHandle->new(PATH_TO_DATAFILE); 
my $data 
    = { trial_times => [] 
     , totals  => {} 
     }; 
my $precision = 0; 

while (<$fh>) { 
    if (m/^for (\d+) threads:/) { 
     push @{$data->{trial_times}}, {}; 
    } 
    elsif (m/^Average time taken for (API\w+) is: (\d+\.(\d+)) nanoseconds./) { 
     push @{$data->{trial_times}[-1]{$1}}, $2; 
     push @{ $data->{totals}->{$1} }, $2; 
     $precision = length $3 if length $3 > $precision; 
    } 
} 

### $data 

foreach my $api (keys %{ $data->{totals} }) { 
    my @list = @{ $data->{totals}{$api} }; 
    my $sum =sum @list; 

    printf "Sum for %d runs of API $api: %0.${precision}f (Average: %0.${precision}f)\n" 
     , scalar @list, $sum, $sum/scalar @list 
     ; 
} 

my @combined = map { @$_ } values %{$data->{totals}}; 
### @combined 
my $sum  = sum @combined; 
printf "Combined %d runs for %0.${precision}f total (Average: %0.${precision}f)\n" 
    , scalar @combined, $sum, $sum/scalar @combined 
    ; 
相關問題