请教:Perl提取域名并计数+排序

smile665
笑遍世界 2010-05-08 字数 528

url.txt内容如下:

http://www.google.com/index.html

http://www.google.com/1.html

http://taobao.com/index.html

http://baidu.com/index.html

http://www.google.com/3.html

http://taobao.com/2.html

要求统计出url.txt中的域名,并按照出现次数从大到小排列,将结果保存到一个文件c

ountUrl.txt中。期望的countUrl.txt内容如下:

3 www.google.com

2 taobao.com

1 baidu.com

网上找了一下,看到用bash的很强大,cat url.txt | sed -e ' s/http:\/\///' -e '

s/\/.*//' | sort | uniq -c | sort -rn > countUrl.txt

这样就可以了。请问大家用Perl怎么实现??  初学Perl。。。

Perl Perl的世界
5 个回复
smile665
笑遍世界 2010-05-08

求个简单点的办法。。  高手优化一下。。

我用了一个很笨很复杂的方法做出来了,初学perl,下面基本上是按照C的思维来写的。

如下:

#!/usr/bin/perl

open URL, "url.txt"

or die "Can't open url.txt";

my $i = 0;

while (<URL>) {

if (/\/\/(.*)\//g) {

@array[$i] = $1 . "\n";

$i++;

}

}   #提取所有URL

close URL;

my %count;

my @uniq_array = grep { ++$count{ $_ } < 2; } @array;  #去除重复记录

my $i = 0;

my @countUrl;

while ($i < scalar(@uniq_array)) {

my $count = 0;

my $j =0;

while ($j<scalar(@array)) {

$count++ while (@array[$j] =~ m/@uniq_array[$i]/g);

$j ++;

}  #统计每个URL出现到次数

@countUrl[$i] .= ($count . " @uniq_array[$i]");

$i++;

}

@countUrl = sort{$b cmp $a}@countUrl;  #9个url内 降序排序  暂不考虑更多url

print @countUrl;

open countUrl, ">", "countUrl.txt";

syswrite(countUrl,"@countUrl");

close countUrl;

【 在 smile665 (笑遍世界) 的大作中提到: 】

: url.txt内容如下:

http://www.google.com/index.html

http://www.google.com/1.html

: ...................

ArieShout
呷苦 2010-05-08

用hash做统计会好点吧

不知道有没有啥给hash排序然后直接输出一个数组的方法

#! /usr/bin/perl -w

my (%freq, @arr);

open FILE, "url.txt" or die "Cannot open file!";

while(<FILE>) {

if (/http:\/\/(.*?)\//) {

$freq{$1}++;

}

}

close FILE;

while (my ($k, $v) = each %freq) {

push @arr, [ $k, $v ];

}

open OUTPUT, ">", "output.txt" or die "Cannot open file!";

for my $entry (sort {$b->[1] <=> $a->[1]} @arr) {

print OUTPUT "$entry->[0] $entry->[1]\n";

}

close OUTPUT;

【 在 smile665 (笑遍世界) 的大作中提到: 】

: 求个简单点的办法。。  高手优化一下。。

: 我用了一个很笨很复杂的方法做出来了,初学perl,下面基本上是按照C的思维来写的。

: 如下:

: ...................

celia
工作新生活 2010-05-09

hash的key和value本来就可以排序吧,sorted啥来着

【 在 ArieShout (呷苦) 的大作中提到: 】

: 用hash做统计会好点吧

: 不知道有没有啥给hash排序然后直接输出一个数组的方法

: #! /usr/bin/perl -w

: ...................

ArieShout
呷苦 2010-05-09

哦,翻了一下可以这样,看起来好多了

#! /usr/bin/perl -w

my %freq;

open FILE, "url.txt" or die "Cannot open file!";

while(<FILE>) {

if (/http:\/\/(.*?)\//) {

$freq{$1}++;

}

}

close FILE;

open OUTPUT, ">", "output.txt" or die "Cannot open file!";

for my $key (sort { $freq{$b} <=> $freq{$a} } keys %freq) {

print OUTPUT "$key $freq{$key}\n";

}

close OUTPUT;

【 在 celia (工作新生活) 的大作中提到: 】

: hash的key和value本来就可以排序吧,sorted啥来着

smile665
笑遍世界 2010-05-10

真强大。。 不过好难懂。。

【 在 alzuse (静等) 的大作中提到: 】

: flw有很精妙的一行代码哦。

: 我写了一个,不过很丑陋:

: perl -ne 's{http://}{}; s{/.*}{}s; $Url{$_}++ if /\./;' \

: ...................