![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
自分のPerlの知識と能力では全くわからなかったので、ご質問いたします。今、タブ区切りのデータがあります。※下記のデータは便宜上、タブを/で表現しています。
現在、下記のようなデータが10万ぐらいあるのですが、10万の中から、タブの6、7、8番目の3つのデータで全く同じになった場合、カウントしたいと思っています。
<データ>
PB10_00045/10/B/神々/カミガミ/神々/カミガミ/名詞-普通名詞-一般/0/1/カミガミ/10/30/神々/0/1/1
PB10_00047/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
PB10_00047/30/I/零落/レイラク/零落/レイラク/名詞-普通名詞-サ変可能/0/1/レーラク/40/60/零落/0/1/1
例えば、上の例であれば、6、7、8は次のようになりますが、
1つ目のデータ:6→神々、7→カミガミ、8→名詞-普通名詞-一般
2つ目のデータ:6→の、7→ノ、8→助詞-格助詞
3つ目のデータ:6→零落、7→レイラク、8→名詞-普通名詞-サ変可能
6、7、8の3つのデータでちがうので、下記のように文頭にそれぞれ頻度を1と表したいです。※3つでそろった場合のみ、カウントを増やしたいです。
1/PB10_00045/10/B/神々/カミガミ/神々/カミガミ/名詞-普通名詞-一般/0/1/カミガミ/10/30/神々/0/1/1
1/PB10_00047/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
1/PB10_00047/30/I/零落/レイラク/零落/レイラク/名詞-普通名詞-サ変可能/0/1/レーラク/40/60/零落/0/1/1
現在、ウィンドウズの環境で、Perlは5.8を使っております。
どなたか、助けてくださると、幸いです。
No.4ベストアンサー
- 回答日時:
#2になにも返事してないってことは丸投げ?
そもそも「ご質問」はないわな。
#!/usr/bin/perl
use strict;
use warnings;
my $delim = '/';
my %counts;
my %lines;
while (my $line = <DATA>) {
chomp $line;
my $key = join $delim, (split $delim, $line)[5,6,7];
$counts{$key}++;
$lines{$key} ||= $line;
}
foreach my $key (keys %lines) {
#printf "%d/%s\n", $counts{$key}, $lines{$key};
printf "%d/%s\n", $counts{$key}, $key;
}
__END__
PB10_00045/10/B/神々/カミガミ/神々/カミガミ/名詞-普通名詞-一般/0/1/カミガミ/10/30/神々/0/1/1
PB10_00047/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
PB10_00047/30/I/零落/レイラク/零落/レイラク/名詞-普通名詞-サ変可能/0/1/レーラク/40/60/零落/0/1/1
PB10_00045/10/B/神々/カミガミ/神々/カミガミ/名詞-普通名詞-一般/0/1/カミガミ/10/30/神々/0/1/1
PB10_00047/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
PB10_00047/30/I/零落/レイラク/零落/レイラク/名詞-普通名詞-サ変可能/0/1/レーラク/40/60/零落/0/1/1
PB10_00045/10/B/神々/カミガミ/神々/カミガミ/名詞-普通名詞-一般/0/1/カミガミ/10/30/神々/0/1/1
PB10_00047/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
PB10_00048/20/I/の/ノ/の/ノ/名詞-非自立/0/1/ノ/30/40/の/0/1/1
PB10_00050/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
>perl okw.pl
3/神々/カミガミ/名詞-普通名詞-一般
2/零落/レイラク/名詞-普通名詞-サ変可能
4/の/ノ/助詞-格助詞
1/の/ノ/名詞-非自立
十万件あったとして、みたとこデータ一件が100バイトそこそこですから
Perlが管理するために余計なものが引っ付いたとしても
PCのスペック次第でいけなくもないでしょう。
頻度表とやらで出力するときに行丸ごとが必要ないならその分減るでしょうし。
No.5
- 回答日時:
できなかったにしても, 単に「できなかった」とだけ書くのではなく「これこれこうなった」とまで書くようにしてほしい. 実際にどうなったかというのは, 考える上で大きなヒントになる. あなたの周りがどうかはさておいて, 一般に超能力者は多くないと推定されるんだから. 「回答しやすい質問」というものを心掛けてほしいなあ.
でなんだけど, これは「split をそのまま書いたんだろうな」と推測できる. もしそうなら, split するときにタブで区切るように直してくれ.
No.3
- 回答日時:
面倒なことをしたくなかったらハッシュを使えばいいんじゃないの?
例えば
while (<>) {
++$occurence{join('/', (split(m!/!))[5, 6, 7])};
}
で終わり?
もちろん順序が重要なときにはそれなりの処理が必要ですが.
No.2
- 回答日時:
10万件のデータというのが厄介だなぁ
そのデータはある程度固定であり、ごく希にしか内容が変化しない、と仮定の上にあれば、これで何とかなると思います。
1.6,7,8番目をソートキーとしてソートする。
2.前の行と現在の行を順番にチェックしていく
3.6,7,8,がそれぞれ同一内容ならカウントを増やし、違っていたらファイルへ追記出力
4.ループで無くなるまでやる
こんな感じでやれば、チェック出来るかな?
sort { (split(/\t/,$a))[$x]<=>(split(/\t/,$b))[$x]; } @array; //二次元配列を昇順ソートする $xにはソートキーになる配列番号を入れる
を使用して、6,7,8をそれぞれ1回ずつソートしたデータを作って、
後はループでガンガン。
問題点としては、一度ソートしてしまうので、順番が狂うと困る場合には、全行程終了後にソートし直す必要がある。ソート回数が多いので時間がかかる。
データを追記したり変更する場合には、それなりに凝ったアルゴリズムで対策した方がいい。
と、いろいろと面倒な部分もありますが、
これで何とかなりそうですか?
No.1
- 回答日時:
6と7と8が=になったらカウントアップ、という事なのですか?
もしそうでしたら、splitとstrcmpあたりを使えば出来ますけど、
それでいいのでしょうか?
if文を少し組み合わせれば、出現頻度が調べれますけど
この回答への補足
わかりにくかったようで、申し訳ありません。それと、自分のやりたいことにちょっと問題もあったので、補足いたします。すみません。たとえば、下記のようであれば、6番目、7番目、8番目で全く同じ場合にカウントします。たとえば、下記のデータでは、2番目のデータは、6→の、7→ノ、8→助詞→格助詞ですが、3番目は6→の、7→ノ、8→名詞→非自立となり、3つすべてが同じではないので、別のものとしてカウントをしたいと思います。
<データ>
PB10_00045/10/B/神々/カミガミ/神々/カミガミ/名詞-普通名詞-一般/0/1/カミガミ/10/30/神々/0/1/1
PB10_00047/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
PB10_00048/20/I/の/ノ/の/ノ/名詞-非自立/0/1/ノ/30/40/の/0/1/1
PB10_00050/20/I/の/ノ/の/ノ/助詞-格助詞/0/1/ノ/30/40/の/0/1/1
ここからちょっと訂正したいのですが、
頻度表では、6と7と8だけを取り出し、文頭に頻度をつけたいと思っております。
頻度表
<データ>
1/神々/カミガミ/名詞-普通名詞-一般
2/の/ノ/助詞-格助詞
1/の/ノ/名詞-非自立/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 提示した結果構文が非文となる理由について 1 2022/07/25 12:22
- 英語 先行詞の限定詞が所有格の可否と可能な場合の定冠詞との使い分けについて 1 2022/11/30 15:03
- Perl perlのプログラミング 部分入れ替えの方法 1 2022/10/11 22:26
- 英語 英語における名詞と形容詞の感覚の違いについて 4 2023/06/26 14:07
- 英語 「子供の頃の大好物」等の『「~の頃の」+名詞』の表現について 8 2022/04/28 11:36
- 英語 moreの品詞と用法について 6 2022/10/20 04:24
- 英語 関係代名詞節、「名詞+of+whose+名詞~」の表現の可否等について 2 2022/12/01 13:48
- 英語 提示文の構造等について 2 2022/12/25 23:24
- 日本語 「サ変動詞」(熟語動詞)(仮称)に関する疑問 8 2023/08/03 18:29
- 英語 関係形容詞"which"の感覚について 4 2022/12/05 11:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
csvで順番の入れ替え
-
Perlでのforeach文の挙動がわか...
-
window.open でのファイル指定方法
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
-
エクセルVBAで素数だけを出力す...
-
fgets で値が取得できない
-
エクセルVBA コードが同じでも...
-
DOSコマンドで、標準出力を出力...
-
MATLABのm-fileについて
-
openした後、closeしないでプロ...
-
Perlで特定行から特定行までを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どのようなプログラムをつくれ...
-
csvで順番の入れ替え
-
perlでの三次元配列の作り方
-
配列の中に重複文字列があるか...
-
要素を削除する最適な方法
-
perlで複数行のデータを自由に...
-
pushをすると行ができる
-
ファイルから読み込んで配列へ
-
Perlの初歩的な質問・・・
-
行・列の整理! perl
-
C言語のバイナリモードでのfsca...
-
perl-cgi 文字の長さでソートし...
-
C言語でバイナリファイルの読み...
-
Pythonの再帰関数の動作の流れ...
-
CSVデータ「","」と「,」混在読...
-
perlで読み込んだURLを配列に入...
-
perlの無名配列の使い方を教え...
-
ソートのテクニックについて
-
ランダムでかぶらないように4...
-
頻度表の作成(Perl初心者です)
おすすめ情報