Предполагая, что данные, которые вы предоставили, эта проблема вполне понятна Perl без базы данных:
my %data;
while (my $line = <DATA>) {
chomp $line;
my ($c1, $c2, undef, @cols) = split /\|/, $line, -1;
$data{"$c1|$c2"}[$_] += $cols[$_] for 0 .. $#cols;
}
print join('|' => $_, @{ $data{$_} }), "\n" for sort keys %data;
__DATA__
A|B|C|100|200|300
A|B|C|200|100|0
A|X|C|100|100|100
, которая печатает:
A|B|300|300|300
A|X|100|100|100
Вам, конечно, нужно будет написать кодостальные преобразования, но это должно дать вам начало.Даже если оказывается, что вам нужно обращаться к необработанным строкам более одного раза, предполагая, что ваши данные не гигантские, вы можете загрузить их в двумерный массив и затем выполнить свои проходы через него.Или вы можете использовать Tie::File
для доступа к очень большому файлу, не читая его все.