Hi,John
I think you have understanded wrongly with my meaning.
The result of $low{ $1 }++ is no use for me.I just want the frequency of IP
exists.
For example, if there are some IPs exists in '22.33.44.0' :
22.33.44.11
22.33.44.22
22.33.44.22
22.33.44.33
22.33.44.33
22.33.44.44
22.33.44.55
Now I only want the uniq times of all IP appeared,this is 5.
On 12/8/05, John W. Krahn <[EMAIL PROTECTED]> wrote:
>
> Jennifer Garner wrote:
> > hi,lists,
>
> Hello,
>
> > I have a file which is so large,which looking as:
> >
> > 61.156.49.18:28360
> > 61.183.148.130:27433
> > 222.90.207.251:25700
> > 202.117.64.161:25054
> > 218.58.59.73:24866
> > 221.233.24.9:22507
> > 222.187.124.4:21016
> > ...
> >
> > and more than 45000000 lines.
> >
> > the part after ":" is no use for me,I only need the IP.
> >
> > for each IP,such as '218.58.59.73', I want to get this result:
> >
> > 218.58.59. xxx yyy xxx+yyy
> >
> > I want to know how many IP are in the range of '218.58.59.1' to '
> > 218.58.59.127',this is 'xxx';
> > and how many IP are in the range of '218.58.59.128' to '218.58.59.254
> ',this
> > is 'yyy'.
> >
> > I write this code:
> > open (FILE,$file) or die "$!";
> > while(<FILE>)
> > {
> > next if /unknown/o;
> > next if /^192\.168\./o;
> > chomp;
> > my ($ip,$num) = split/:/,$_;
> > if ($ip = ~ /^(\d+\.\d+\.\d+\.)(\d+)/o){
> > my ($net,$bit) = ($1,$2);
> > $total{$net}{low}{$bit} = 1 if $bit < 128;
> > $total{$net}{high}{$bit} = 1 if $bit >=128 and $bit
> <
> > 255;
> > $total{$net}{total}{$bit} = 1;
> > }
> > }
> > close FILE;
> >
> > foreach (sort { scalar keys %{$total{$b}{total}} <=> scalar keys
> > %{$total{$a}{total}} } keys %total)
> > {
> > print RESULT "$_","\t",scalar keys %{$total{$_}{low}},"\t",
> > scalar keys %{$total{$_}{high}},"\t",scalar keys
> > %{$total{$_}{total}},"\n";
> > }
> >
> >
> > but it's too slow for me to wait the result.How can I get it more
> effective
> > and run less time?thanks.
>
> This is quite a bit faster then your version:
>
> open FILE, '<', $file or die "Cannot open '$file' $!";
>
> my ( %low, %high, %total );
> while ( <FILE> ) {
> next if /unknown/;
> next if /^192\.168\./;
>
> next unless /^(\d+\.\d+\.\d+\.)(\d+)/;
>
> if ( $2 < 128 ) {
> $low{ $1 }++;
> }
> else {
> $high{ $1 }++;
> }
>
> $total{ $1 }++;
> }
>
> close FILE;
>
>
> for ( sort { $total{ $b } <=> $total{ $a } } keys %total ) {
> print RESULT "$_\t", $low{ $_ } || 0, "\t", $high{ $_ } || 0, "\t",
> $total{ $_ }, "\n";
> }
>
>
> John
> --
> use Perl;
> program
> fulfillment
>
> --
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> <http://learn.perl.org/> <http://learn.perl.org/first-response>
>
>
>