• ベストアンサー

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/

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

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)

回答No.4

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 で指定して実行してください)。

ayu_mi_nic
質問者

お礼

皆様へ たくさんのご回答いただ本当にありがとうございました。 とても、参考になりました!!

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

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

参考URL:
http://www.linux.or.jp/JM/html/gnumaniak/man1/uniq.1.html
  • SE-1
  • ベストアンサー率57% (26/45)
回答No.1

open IN, "< log.txt"; my @array = <IN>; としておいて、 以下の URL "配列から重複した要素を取り除く" を参考にされるとご希望のことができると思います。 注)undef(%count) の方です。

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm

関連するQ&A