![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
perl 超!初心者です。同一データの数え上げ。
あまり上手く説明できませんがよろしくお願いします。
ある行から行までの同一データを数え上げる処理をしたいです。
例えば、以下のようなデータがあるとします。
---------------------
<NAME>
田中
佐藤
佐藤
山田
田中
<NAME>
佐藤
田中
渡辺
渡辺
佐藤
-------------------
while (<>){
$linecount{$_}++;
}
foreach $line (sort{$linecount{$b} <=> $linecount{$a}}keys%linecount)
{
print $linecount{$line},"",$line if($linecount{$line} >= 1);
}
これで、行の重複回数と、データを出力はできたのですが、
さらに、<NAME>で区切ってそれぞれの区分で同一データの数を数えていきたいです。結果としては
<NAME>
2 田中
2 佐藤
1 山田
<NAME>
2 渡辺
2 佐藤
1 田中
と出力したいのですが、どうすればよいでしょうか?
No.2ベストアンサー
- 回答日時:
こういうやり方もあるということで。
#!/usr/bin/perl
use strict;
use warnings;
use Fatal qw(:void open close);
use feature ':5.10';
$/ = "<NAME>\n";
while (my $record = <DATA>) {
my %h;
chomp $record;
next if ($record eq '');
foreach my $item (split qq{\n}, $record) {
$h{$item}++;
}
printf("%2d %s\n", $h{$_}, $_) for (sort {$h{$b}<=>$h{$a}} keys %h);
printf "=====\n"
}
__END__
<NAME>
田中
佐藤
佐藤
山田
田中
<NAME>
佐藤
田中
渡辺
渡辺
佐藤
実行結果:
2 田中
2 佐藤
1 山田
=====
2 佐藤
2 渡辺
1 田中
=====
二番目の名前の並びがちと期待通りではないですね。
私も、「$/ = "<NAME>\n";」を使って試してみたのですが、上手くいかなかったのですが、このようにするのですね。大変勉強になりました。ありがとうございました。
No.1
- 回答日時:
"<NAME>"がある行と末尾行が来たら、カウンタの出力とリセットを実行すれば良いのでは?
my %linecounts; #グローバル変数化
-------------------
while (<>)
{
if($_ eq '<NAME>')
{
&present_counter();#NAME行
next;
}
$linecount{$_}++;
}
&present_counter();#末尾用
-------------------
sub present_counter()
{
foreach $line (sort{$linecount{$b} <=> $linecount{$a}}keys%linecount)
{
print $linecount{$line}," ",$line if($linecount{$line} >= 1);
}
undef %linecounts;#クリア
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- Excel(エクセル) Excel ピボットテーブルの表示方法を変更したいのですが、、、(合計値を下部に) 3 2023/06/18 21:10
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- その他(プログラミング・Web制作) Python pandasについての質問です。 日付 名前 ◯月◯日 佐藤 ・ 伊藤 ・ 山田 ・ 2 2022/06/13 17:16
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- 計算機科学 Excel ある行と列が交わったところにマークを付けるには 7 2023/01/24 08:46
- Excel(エクセル) エクセル 関数 指定の繰り返しの回数 以降(以前)を削除するには、 2 2022/04/24 10:29
- ドラマ 壬生義士伝 1 2023/01/02 13:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlでcsvファイルを読む(ダブ...
-
Perlで特定行から特定行までを...
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ファイル名を複数個配列で確保...
-
batファイルでrenameができませ...
-
Windowsで複数のファイルを同じ...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
AutoNts
-
ファイルを分割する。
-
LISPによる横型探索
-
cgiで表示するhtmlページ内でバ...
-
全角と半角文字が混在している...
-
エクセルVBA コードが同じでも...
-
DOSコマンドで、標準出力を出力...
-
Visual Basicを使って三平方の...
-
readdir()で得られるファイル・...
-
CSVが可変長の場合の検索方法
-
system関数と引数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
Perlの初心者です。2重ループ...
-
perlでcsvファイルを読む(ダブ...
-
Argument "\\\\n" isn't numeri...
-
perlにてスペースの削除に苦労...
-
Perl初心者です。同一データを...
-
ファイルの3行目までを出力したい
-
先頭の単語が一致した時のデー...
-
Java CSVファイルをカンマごと...
-
FTP接続時失敗時、接続先名をcs...
-
データファイルからのデータの...
-
MATLAB std::exceptionエラー
-
cgiのログの書き方
-
エラーチェック、ファイルに特...
-
Perlで空白行を削除
-
perl:パターンマッチを使ったif...
-
CSVファイルのデータの行数を取...
-
外部ファイルからの指定行と指...
-
コマンド上の行間
-
perlでファイルの比較
おすすめ情報