Perl читает журнал со всеми подсчетами - PullRequest
1 голос
/ 23 февраля 2011

Я пытаюсь прочитать файл журнала, используя 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

какчтобы получить такой вывод?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Вы можете использовать хеш для суммирования данных для каждой временной метки, например, так:

# 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 голосов
/ 23 февраля 2011

%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});
}

или что-то в этом роде ... Я не пробежалэто, но что-то вроде этого, я думаю, это то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...