2011-02-23 10 views
1

すべての上のカウントでログイン読み、Perlの私はPerlを使用して、ログファイルを読み込むしようとしています

は、私は約500行、私が欲しい

timestamp, amount1, amount2, amount3 
12334  20   0  0 
12335  0   20  0 
12335  0   20  20 
12336  0   20  0 
12336  0   20  20 

のようなものを持っている出力として

12334 20 0 0 
12335 0 40 20 
12336 0 40 20 

このような出力を得るには?あなたは、各タイムスタンプのためにこのような何かのデータを要約するためにハッシュを使用することができます

答えて

3

:あなたのデータは、任意のより複雑であればもちろん

# skip header 
my $header = <DATA>; 

# read data into a hash 
my %summary =(); 
while(<DATA>) { 
    chomp; 
    my ($timestamp, @amounts) = split; 
    for my $i (0..$#amounts) { 
     $summary{$timestamp} ||= []; 
     $summary{$timestamp}[$i] += $amounts[$i]; 
    } 
} 

# print out the summary 
for my $timestamp (sort { $a <=> $b } keys %summary) { 
    print $timestamp," ",join(" ",@{ $summary{$timestamp} }),"\n"; 
} 

__DATA__ 
timestamp, amount1, amount2, amount3 
12334  20   0  0 
12335  0   20  0 
12335  0   20  20 
12336  0   20  0 
12336  0   20  20 

を、あなたは、データを処理するために(Text::xSVのように)適切なパーサを使用する必要があります。

2

%myHash =();

while (<>) { 
    my ($ts,$a1,$a2,$a3) = split; 
    # Put into hash by ts-value 
    if (exists $myHash{$ts}) { 
     $myHash{$ts}{amount1} = $myHash{$ts}{amount1} + $a1; 
     $myHash{$ts}{amount2} = $myHash{$ts}{amount2} + $a2; 
     $myHash{$ts}{amount3} = $myHash{$ts}{amount3} + $a3; 
    } 
    else { 
     $myHash{$ts}{amount1} = $a1; 
     $myHash{$ts}{amount2} = $a2; 
     $myHash{$ts}{amount3} = $a3; 
    }  
} 

そしてちょうどハッシュのキーを通過し、

foreach (keys %myHash) { 
    printf("%5d %3d %3d %3d\n", $_, $myHash{$_}{amount1}, $myHash{$_}{amount2}, $myHash{$_}{amount3}); 
} 

またはそのような何かをプリントアウト...私はそれを介して実行していない、しかし、のようなものこれ、私はあなたが欲しいものだと信じていますか?

関連する問題