-4

文字列と数値の両方で構成される配列があります。同様の文字列値を持つ数値を合計したい。助けてください!!

インファイル:

aggr3 350.01000213623
aggr3 1228.79999923706
aggr5 250
aggr3 1536
aggr3 690.01000213623
aggr3 1587.20000076294
aggr9 550.01000213623
aggr3 1228
aggr5 905
aggr5 100

必要な出力

aggr3 5391
aggr5 1255
aggr9 550
4

2 に答える 2

3

もしかしてこう?

use strict;
use warnings;

my @data = <DATA>;
my %data;
$data{$_->[0]} += $_->[1] for map [ split ], @data;

print "$_ $data{$_}\n" for sort keys %data;

__DATA__
aggr3 350.01000213623
aggr3 1228.79999923706
aggr5 250
aggr3 1536
aggr3 690.01000213623
aggr3 1587.20000076294
aggr9 550.01000213623
aggr3 1228
aggr5 905
aggr5 100

出力

aggr3 6620.02000427246
aggr5 1255
aggr9 550.01000213623
于 2013-09-08T14:26:50.553 に答える
2

通常、Perl でデータをグループ化したい場合は、ハッシュを使用します。これらのハッシュのキーはグループ化基準に対応し、値はアキュムレータとして機能します (この場合のように単純な数値にすることも、後で処理されるのを待つ数値の配列にすることもできます)。

これを行う1つの方法は次のとおりです。

use warnings;
use strict;

# this hash will hold all the cumulatives
my %sums;

# here we scan the source, line by line
# each line is split to key and value
while (<DATA>) {
  chomp;
  my ($label, $value) = split;

  # this line uses the auto-vivification Perl feature:
  # if there's no corresponding item in %sums hash, it'll be created (with 0 value)
  $sums{$label} += $value;
}

# here we process the resulting hash:
for my $key (sort keys %sums) {
  print $key, ' ', $sums{$key}, "\n";
}
__DATA__
aggr3 350.01000213623
aggr3 1228.79999923706
aggr5 250
aggr3 1536
aggr3 690.01000213623
aggr3 1587.20000076294
aggr9 550.01000213623
aggr3 1228
aggr5 905
aggr5 100

コードパッドのデモ

于 2013-09-08T14:18:58.270 に答える