- ベストアンサー
perlの文字列操作について
perlを下記のことをしたいのですが教えていただけないでしょうか? 若しくは、こういったことのできるスクリプトの参考になるページを教えてください。 確か、perlではハッシュというものを使うことでとても効率的にこれをする方法があったと思うのですが、配列まではなんとかぎりぎり分かったのですがハッシュまでは手が回っていません。 何卒、宜しくお願い致します。 ---log.txt-- http://www.1.com/ http://www.2.com/ http://www.3.com/ http://www.1.com/ http://www.2.com/ http://www.3.com/ http://www.3.com/ http://www.1.com/ ----------- log.txtを解析して、 3>http://www.3.com/ 3>http://www.1.com/ 2>http://www.2.com/
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
open(LOG,"<log.txt"); while(<LOG>){ chomp; $count{$_}++; } close(LOG); foreach $x (sort { $count{$b} <=> $count{$a} } keys %count){ print "$count{$x}>$x\n"; }
その他の回答 (3)
- noboru2000
- ベストアンサー率33% (47/140)
UNIX系OSでよく使われているシェル(sh,csh,bashなど)の場合は以下のようにコマンドラインから入力すればできると思います。 perl -ne 'chomp;$u{$_}++;END{for(sort{$u{$b}<=>$u{$a}}keys%u){print"$u{$_}>$_\n"}}' log.txt Windowsのコマンドプロンプトの場合はプログラム全体をシングルクォーテーションではなくダブルクォーテーションで括って、最後の print の所のダブルクォーテーションは qq() か何かにしてください。(面倒なら上記のプログラムをまるごとファイルに入れて perl -n で指定して実行してください)。
- osamuy
- ベストアンサー率42% (1231/2878)
UNIX系OSですと、標準装備のコマンドだけで実現できます。 二つのコマンドsortとuniqを組み合わせるのですが、sortはWindowsにもあるので、uniqを実装するだけですみます。こんな感じ: exit unless my $o = <>; $, = '>'; my $n = 1; while ( <> ){ if ( $o eq $_ ){ $n++; } else { print $n, $o; $n = 1; $o = $_; } } print $n, $o; で、コマンドラインで以下のように実行します: sort <log.txt | perl uniq.pl
- SE-1
- ベストアンサー率57% (26/45)
open IN, "< log.txt"; my @array = <IN>; としておいて、 以下の URL "配列から重複した要素を取り除く" を参考にされるとご希望のことができると思います。 注)undef(%count) の方です。
お礼
皆様へ たくさんのご回答いただ本当にありがとうございました。 とても、参考になりました!!