ppnair
ppnair

Reputation: 23

Perl Format the Output in nice way

I have written a perl code for processing file 'Output.txt' which has below Content.

  new.example.com 28
  new.example.com 28
  example.com 28
  example.com 29
  example.com 29
  example.com 29
  example.com 29
  orginal.com 28
  orginal.com 29
  orginal.com 30
  orginal.com 31
  expand.com  31

And file 'domain.txt' has list of domain Names which i need to match against File 'Output.txt'

new.example.com
example.com
orginal.com
test.com
new.com

I could manage to write PERL code like this

#!/usr/bin/perl
use strict;
open(LOGFILE,"Output.txt") or die("Could not open log file.");
my $domain_name = 'domain.txt' ;
open(DOM, $domain_name);
my @r_contents = <LOGFILE>;
close(LOGFILE);    
while(<DOM>) {
    chomp;
    my $line = $_;
    my @lowercase = map { lc } @r_contents;
    my @grepNames = grep  /^$line/, @lowercase;
    foreach (@grepNames) {
        if ( grep  /^$line/, @lowercase ) {
            $domains{lc($_)}++ ;            }
    }
}

close(DOM) ;    
foreach my $domain (sort keys %domains) {
    my %seen ;
    ($Dname, $WeekNum) = split(/\s+/, $domain);
    my @array1 = grep { ! $seen{ $_ }++ } $WeekNum;
    push @array2, @array1;
    my @array4 = "$domains{$domain} $domain" ;
    push @matrix,@array4 ;
}
   printf "%-10s %-25s %-25s\n", 'DoaminName', "Week $array2[0]" ,"Week $array2[1]","Week $array2[2]";
   print " @matrix \n";

current Output looks like this.

 DoaminName         Week 28        week29   week30  week 31
 2 new.example.com 35
 1 example.com 28
 4 example.com 29
 1 orginal.com 28
 1 orginal.com 29
 1 orginal.com 30
 1 orginal.com 31

But i trying re-write the perl code to print the output like this .Please help me to correct the code.

Domain/WeekNumber   Week28       Week29        Week30        Week31
new.example.com     2            No            No            No
example.com         1            4             NO            NO
orginal.com         1            1              1             1

Upvotes: 0

Views: 331

Answers (1)

protist
protist

Reputation: 1220

This produces the desired output, only I also sorted the output.

If you have long website names, add tabs in the code as necessary.

#!/usr/bin/perl
use warnings;
use strict;
open my $fh, "<", "Output.txt" or die "could not open Output.txt\n";

my %data;
my %weeks;
while(<$fh>){
    chomp;
    $_=~ m/(.*?)\s++(\d++)/;
    my $site=$1;
    my $week=$2;
    $weeks{$week}++;
    $data{$site}{$week}++;
}

print "Domain/WeekNumber";

for my $week (sort {$a <=> $b} keys %weeks){
    print"\tWeek$week";
}
print"\n";

for my $site(sort keys %data){
    print"$site\t\t";
    for my $week (sort {$a <=> $b} keys %weeks){
            unless(defined $data{$site}{$week} ){
                    print"NO\t";
            }else{
                    print $data{$site}{$week} ."\t";
            }
    }
    print"\n";
}
close $fh;

Upvotes: 1

Related Questions