人生で一番お金がなかったとき

ご教示お願い致します。
以下のファイルがあり

test.txt
------------------------
1,name1,ttt,1
2,name2,eee,1
1,name3,rrr,1
2,name3,fff,1
1,name5,ggg,1
1,name6,kkk,a
2,name6,kkk,a
2,name6,kkk,a
1,name6,kkk,a
2,name6,kkk,a
1,name6,kkk,3
2,name6,kkk,a
------------------------
test.pl
------------------------
use strict;
use warnings;
my %hash1 = ();
my @arrey1;
open(F, "<","test.txt") or die("error :$!");
eval{ flock(F, 1) };
while(<F>){
chomp;
my @temp = split /,/;
push @arrey1 , $temp[1];
}
close F;

foreach (@arrey1) {$hash1{$_}++;}
my @Data1 = sort keys %hash1;
print @Data1;
------------------------
結果 @Data1
------------------------
name1name2name3name5name6
------------------------

まず、名前をまとめるとこまでできたのですが、
ここからがわからないです。

やりたいことは、ここから、
$temp[0] が 1 の数を名前ごとにまとめ

ほしい結果
-----------------------
name1=1
name2=0
name3=1
name5=1
name6=3
------------------------
そこから上位3名を抜粋したい
※重複値は含める
ほしい結果
-----------------------
name6=3
name1=1
name3=1
name5=1
------------------------

このようなことを実行したいのですが、わかりません・・・
どうかご教示お願い致します。

A 回答 (3件)

No2です。

No2は無視してください。
こちらを採用してください。失礼しました。
use strict;
use warnings;
my %hash1 = ();
open(F, "<","test.txt") or die("error :$!");
eval{ flock(F, 1) };
while(<F>){
chomp;
my @temp = split /,/;
if ($temp[0] eq '1'){
$hash1{$temp[1]}++;
}
}
close F;
#値でキーをを降順にソートし、上位3件のみ出力する
my $pval = -1;
my $count = 0;
foreach(sort {$hash1{$b} <=> $hash1{$a}} keys %hash1){
if (($pval != $hash1{$_} && $count < 3) || $pval == $hash1{$_}){
printf("%s=%d\n",$_,$hash1{$_});
$count++;
}else{
last;
}
$pval = $hash1{$_};
}
    • good
    • 0
この回答へのお礼

ありがとうございました。
実行できました!!

お礼日時:2018/02/17 15:15

以下のようにしてください。


連想配列のキーを値で降順にソートし、上位3件を出力しています。
use strict;
use warnings;
my %hash1 = ();
open(F, "<","test.txt") or die("error :$!");
eval{ flock(F, 1) };
while(<F>){
chomp;
my @temp = split /,/;
if ($temp[0] eq '1'){
$hash1{$temp[1]}++;
}
}
close F;
#値でキーをを降順にソートし、上位3件のみ出力する
my $pval = -1;
my $count = 0;
foreach(sort {$hash1{$b} <=> $hash1{$a}} keys %hash1){
if (($pval != $hash1{$_} && $count < 3) || $pval == $hash1{$_}){
printf("%s=%d\n",$_,$hash1{$_});
$count++;
}
$pval = $hash1{$_};
}
    • good
    • 0

ぱっと思いつく手順は


・$temp[0] が 1 の数を名前ごとにまとめる
・1 の数ごとに名前をまとめる
・1 の数の多いものから順に出力する
くらい?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!