> Hello,
>  
> Im trying to sum up a column from my results. Help.
>  
> current output:
> Date_Time, SRCIP, DSTIP, TOTALBYTES
> 01-01-2004 12:56:48, 192.168.1.1, 192.168.2.2, 2768
> Sum Of Bytes = 2768
> 01-01-2004 12:56:48, 192.168.2.2, 192.168.1.1, 438
> Sum Of Bytes = 876
> 01-02-2004 16:49:45, 192.168.3.3, 192.168.4.4, 9058
> Sum Of Bytes = 27174
> 01-02-2004 16:49:45, 192.168.4.4, 192.168.3.3, 918
> Sum Of Bytes = 3672
>  
> goal:
> Date_Time, SRCIP, DSTIP, TOTALBYTES
> 01-01-2004 12:56:48, 192.168.1.1, 192.168.2.2, 2768
> 01-01-2004 12:56:48, 192.168.2.2, 192.168.1.1, 438
> Sum Of Bytes = 3206
> 01-02-2004 16:49:45, 192.168.3.3, 192.168.4.4, 364
> 01-02-2004 16:49:45, 192.168.4.4, 192.168.3.3, 513
> Sum Of Bytes = 877
>  
>  
> Im stuck. Should I use a hash??
>

Hash shouldn't be necessary unless they are not ordered.
  
> Current Script:
> #!/usr/bin/perl
> use Socket;
> use strict;
> use POSIX 'strftime';
> use warnings;
> my $time = strftime "%y%m%d%H", localtime;
> my $count = "0";
>  

No need to quote integers during assignment.

> # open the file
> open(LOG,"@ARGV") or die "Unable to open LOG:$!\n";
> 

Why are you opening @ARGV, doesn't seem like this would work, that or
Perl is doing something under the hood that I don't expect, but very
little surprises me :-).

> print "Date_Time, SRCIP, DSTIP, TOTALBYTES \n";
> 
> # read it in one record at a time
> while (<LOG>) {
> my ($logdate,$srcip,$dstip,$totalbytes) = split(/\t/,$_);
> my ($date,$time )= split(/\s/,$logdate);
> my @hour = split(/:/,$time);

You can capture the above to get just the hour if you want to, with,

my ($hour) = split(/:/, $time);

>  
> next if $_ =~ /^\D/;

Why do this down here, it seems it would be more efficient to catch it
as early as possible.

> 
> if ($hour[0] >= 6 and $hour[0] < 22){
> print  "$logdate,$srcip,$dstip,$totalbytes";
> $count++;
> my $sum = $count * $totalbytes;

This is likely your problem.  Are you really trying to sum the # of
bytes?  If so why are you multiplying it times the $count, which is
seemingly the line of the file that you are currently processing.  Also,
$sum will have to be scoped ouside the loop otherwise it will be reset
for each line of input that you process, you really need to keep it for
each iteration and then only clear it when the hour/date you are
currently on is not the same as the previous hour/date.

> print "Sum of Bytes = $sum\n";
>                               }
>                                        }
> # close the file
> close(LOG);
> 
>  
> Thanks for any input......
>  
> Rob
>  

So in pseudo code it will look something like:

my $sum = 0;
my $prev_date;
while (my $line = <LOG>) {
   .
   .
   .
   my $current_date = ....;

   if ($prev_date ne $current_date) {
       print "Total: $sum\n";    # display before clearing
       $sum = 0;
   }
   $sum += $totalbytes;
   $prev_date = $current_date;
}

# don't forget the last one, aka the while loop has stopped
# so we need one last "date change"
if ($sum != 0) {
   print "Total: $sum\n";
}

http://danconia.org

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to