I love perl!
ということで,一番簡単な方法はハッシュを使うことです.
lang
1#data.txtのオープン
2open(FILE, "<data.txt");
3
4#空配列(ハッシュ)の作成
5my %data = ();
6
7# FILEの中身があるかぎり繰り返す
8while (<FILE>) {
9 # tab(\t)でデータを分割
10 my @sp = split(/\t/, $_);
11
12 # 1列目の値をキーに,配列の中身を足し算
13 $data{$sp[0]} = $data{$sp[0]} + $sp[2];
14
15}
16
17#クローズ
18close(FILE);
19
20
21#表示とか
22while ( my ($key, $val) = each %data ) {
23 #今回は,$keyに1列目の文字(A,B,C),$valに足し算結果が入ります.
24 print "$key : $val\n";
25}
26
271;
↓ 結果
とりあえず,行いたいこと(加算)は実現しました.
次に,ハッシュのせいで順番がぐっちゃぐちゃになります.
kent-webさん(なつかしい・・・)では,tieをつかえば,入力順にソートされるとのことですが,いかんせん私の環境にはtieが入っていないようです…(ここ数年perlを書いていなかったし…)
なので,強引に…
lang
1#data.txtのオープン
2open(FILE, "<data.txt");
3
4#空配列(ハッシュ)の作成
5my %data = ();
6
7#出現順に並べ替える用の変数
8my @sort = ();
9
10# FILEの中身があるかぎり繰り返す
11while (<FILE>) {
12 # tab(\t)でデータを分割
13 my @sp = split(/\t/, $_);
14
15 # 1列目の値をキーに,配列の中身を足し算
16 $data{$sp[0]} = $data{$sp[0]} + $sp[2];
17
18 # @sort変数の中に重複がなければ,一列目の文字を追加
19 my $flag = 0;
20 for (my $v=0; $v<@sort; $v++){
21 if ($sort[$v] eq $sp[0]){
22 $flag = 1;
23 last;
24 }
25 }
26
27 if ($flag == 0){
28 push(@sort, $sp[0]);
29 }
30
31}
32
33#クローズ
34close(FILE);
35
36
37#表示とか
38for (my $v=0; $v<@sort; $v++){
39 print "$sort[$v] : $data{$sort[$v]}\n";
40}
41
421;
あまりスマートではないですが,こんな感じでいかがでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。