Michael Alipio wrote:
> Hi,
Hello,
> I have a long log file that looks like this:
>
> 7491 | 210.23.185.123 | PH 202597706
> 7491 | 210.23.169.91 | PH 202594221
> 7303 | 201.252.130.245 | AR 201955854
> 9318 | 210.205.6.225 | KR 201892149
> 9930 | 210.19.229.57 | MY 201418551
> 9600 | 210.251.253.180 | JP 201362230
> 9929 | 210.82.176.84 | CN 201069109
> 7491 | 210.23.182.102 | PH 201006342
> 9600 | 210.251.253.180 | JP 201322301
> 4134 | 58.215.76.36 | CN 170125144
> 4844 | 210.23.5.177 | SG 170067928
>
> It contains 4 columns, 1st and 2nd as well as 2nd and 3rd were
> separated by a pipe,
> My goal is to add up the last column belonging to the same
> Country (column 3) display it in descending order, such that I
> may know what country received the biggest amount of bytes. The
> countries included in the log file are not a fixed list.
> Sometimes it contains PH, JP, KR sometimes, it contains PH and
> JP only, and sometimes it contains even more countries CN, JP,
> DE, US, PH, JP, KR.
>
> It might look like this:
>
>
> Country Total Bytes
>
> PH 4000000000
> KR 3000000000
> JP 2000000000
> CN 1000000000
> ...
> ...
>
> And I'm thinking, perhaps I should get a unique list of all
> countries included in this logfile and only then I can aggregate
> their Bytes by using regexp.
>
> Can you give me some hints on how I can accomplish this goal..
You probably want something like this:
my %data;
while ( <LOGFILE> ) {
my ( $country, $bytes ) = ( split )[ -2, -1 ];
$data{ $country } += $bytes;
}
print "Country Total Bytes\n";
for my $country ( sort { $data{ $b } <=> $data{ $a } } keys %data ) {
print "$country $data{ $country }\n";
}
John
--
Perl isn't a toolbox, but a small machine shop where you can special-order
certain sorts of tools at low cost and in short order. -- Larry Wall
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>