Perlseeker_1 has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks,

I have a directory under which i have some files as mentioned below

check.1.ABC.dat.gz check.1.ABC_TT1.dat check.1.AB_TT1.dat check.1.ABC.dat

I am executing some unix commands on the files like wc, tail

I am using that output from unix commands and placing that output on exceel sheet

open(DETAIL, "> $DetailFilename") or die("Error: $!"); print DETAIL "$DetailFileHeader\n"; opendir( DIR, $dir ); my @files = grep( /$pattern/, readdir(DIR) ); closedir(DIR); chdir($dir); foreach my $file (@files) { if (($file=~ m/^Gkel_/) && (substr($file, -2) eq 'gz')) { $Gkel_file = $file; my $result = `gunzip -c $file|tail -1`; $Count = substr($result,22,8); system(`gunzip -f $file`); } elsif ($file=~ m/^check.*TT1.dat$/) { my $result = `wc -l $file`; my ($count, $file_name) = split(' ',$result); $result{$hashkey}->[0] = $file_name; $result{$hashkey}->[1] = $count; $hashkey++; } } opendir( DIR, $dir ); my @files = grep( /$pattern/, readdir(DIR) ); closedir(DIR); chdir($dir); foreach my $file (@files) { if (($file=~ m/^Gkel_/) && (substr($file, -2) ne 'gz')) { my $result = `wc -l $file`; my ($count, $file_name) = split(' ',$result); $file1 = substr($file,5,50); $Gkel_file1 = $file_name; $Count1 = $count; system(`mv $file $file1`); } } for my $key (sort keys %result) { $Count1 = $Count1 - $result{$key}->[1]; print DETAIL "$pattern-2013,$Gkel_file,$Count,$Count,$result{$key}->[0 +],$result{$key}->[1],$file1,$Count1,$Count1,TRUE\n"; }

Ouput what i am getting now

Jun-2013 Gkel_check.1.ABC.dat.gz 108418 108418 check.1.ABC +_TT1.dat 470 ,check.1.ABC.dat 107672 107672 TRUE Jun-2013 Gkel_check.1.ABC.dat.gz 108418 108418 check.1.AB_ +TT1.dat 278 ,check.1.ABC.dat 108142 108142 TRUE

Expected Ouput

Jun-2013 Gkel_check.1.ABC.dat.gz 108,418 108,418 check.1.A +BC_TT1.dat 470 check.1.ABC.dat 107,670 107,670 TRUE check.1.AB_TT1.dat 278
  • Comment on regarding file from the directory and executing some commands and placing the out put on exceel sheet.
  • Select or Download Code

Replies are listed 'Best First'.
Re: regarding file from the directory and executing some commands and placing the out put on exceel sheet.
by poj (Abbot) on Jun 21, 2013 at 07:01 UTC
    I'm struggling to understand your output as you don't seem to have any filenames starting with Gkel or should it be
    Gkel_check.1.ABC.dat.gz Gkel_check.1.ABC.dat check.1.ABC_TT1.dat check.1.AB_TT1.dat
    poj
      Hi,

      Please find the results

      my @array; my @Gkel=(); my @Gkel_gz=(); my @Check=(); my @files; opendir( DIR, $dir ); my @files = grep( /$pattern/, readdir(DIR) ); closedir(DIR); chdir($dir); foreach my $file (@files) { if ( $file =~ m/^Gkel_/ ){ if ( substr($file, -2) eq 'gz' ) { my $result = `gunzip -c $file|tail -1`; system(`gunzip -f $file`); my $count = substr($result,22,8); $Gkel_gz[0] = $file; $Gkel_gz[1] = $count; } else { my $result = `wc -l $file`; my ($count, $file_name) = split(' ',$result); my $file1 = substr($file,5); system(`mv $file $file1`); $Gkel[0] = $file1; $Gkel[1] = $count; } } if ( $file =~ m/^check.*Check.dat$/ ){ my $result = `wc -l $file`; my ($count, $file_name) = split(' ',$result); push @Check,[$file,$count]; } } my $Count = $Gkel_gz[1]; my $Count1 = $Gkel[1] - $Check[1]->[1] ; my @row = ('Jun-2013',$Gkel_gz[0],$Count,$Count,$Check[0]->[0],$Check[ +0]->[1],$Gkel[0],$Count1,$Count1,'TRUE',$Check[1]->[0],$Check[1]->[1] +); print join ',',@row,"\n"; print "@row\n"; }

      Outpuy

      Jun-2013,Gkel_Check.I.Jun13.dat.gz,00108418,00108418,Check.I.ABC_TT1.d +at,278,,-470,-470,TRUE,Check.I.AB_TT1.dat,470, Jun-2013 Gkel_Check.I.Jun13.dat.gz 00108418 00108418 Check.I.ABC_TT1.d +at 278 -470 -470 TRUE Check.I.AB_TT1.dat 470

      my expected results are as below

      output

      Jun-2013 Gkel_check.1.ABC.dat.gz 108418 108418 check.1.ABC_TT1.dat 470 + Gkel_check.1.ABC.dat 107670 107670 TRUE<br> Check.I.AB_TT1.dat 278

      470 + 278 should be deducted from the 108418 and answer is 107670
      both lines should come separately

        Try this. I have replaced your hash with numeric keys with a simple 2D array. You will need to activate the lines marked ##, comment out or remove those marked #test, print to the file your want and build your @files array using readdir.

        #!perl use strict; use warnings; my @test = (470,278); #test my @Gkel=(); my @Gkel_gz=(); my @TT1=(); my @files = qw( Gkel_check.1.ABC.dat.gz Gkel_check.1.ABC.dat check.1.ABC_TT1.dat check.1.AB_TT1.dat ); foreach my $file (@files) { if ( $file =~ m/^Gkel_/ ){ if ( substr($file, -2) eq 'gz' ) { ## my $result = `gunzip -c $file|tail -1`; ## system(`gunzip -f $file`); ## my $count = substr($result,22,8); my $count = 108418; #test $Gkel_gz[0] = $file; $Gkel_gz[1] = $count; } else { ## my $result = `wc -l $file`; ## my ($count, $file_name) = split(' ',$result); my $file1 = substr($file,5); my $count = 107948; #test ## system(`mv $file $file1`); $Gkel[0] = $file1; $Gkel[1] = $count; } } if ( $file =~ m/^check.*TT1.dat$/ ){ ## my $result = `wc -l $file`; ## my ($count, $file_name) = split(' ',$result); my $count = shift @test; #test push @TT1,[$file,$count]; } } # Expected #Gkel_check.1.ABC.dat.gz 108,418 108,418 #check.1.ABC_TT1.dat 470 #check.1.ABC.dat 107,670 107,670 TRUE #check.1.AB_TT1.dat 278 my $Count = $Gkel_gz[1]; my $Count1 = $Gkel[1] - $TT1[1]->[1] ; my @row = ('Jun-2013', $Gkel_gz[0],$Count,$Count, $TT1[0]->[0],$TT1[0]->[1], $Gkel[0],$Count1,$Count1, 'TRUE', $TT1[1]->[0],$TT1[1]->[1]); print join ',',@row,"\n"
        poj
        It would have been better to reply to my post rather than update the existing node.
        There is something not quite right here ;
        Var Output Expected --- ------------------------- ----------------------- $Gkel_gz[0] Gkel_Check.I.Jun13.dat.gz Gkel_check.1.ABC.dat.gz $Count 00108418 108418 $Count 00108418 108418 $Check[0][0] Check.I.ABC_TT1.dat check.1.ABC_TT1.dat $Check[0][1] 278 470 $Gkel[0] , Gkel_check.1.ABC.dat $Count1 -470 107670 $Count1 -470 107670 $Check[1][0] Check.I.AB_TT1.dat Check.I.AB_TT1.dat $Check[1][1] 470 278
        You said the files were like this
        Gkel_check.1.ABC.dat.gz Gkel_check.1.ABC.dat check.1.ABC_TT1.dat check.1.AB_TT1.dat
        I don't understand how you can you get Gkel_Check.I.Jun13.dat.gz in the output ? Also, how does this match m/^check.*Check.dat$/ give these
        Check.I.ABC_TT1.dat Check.I.AB_TT1.dat
        in the output ?
        poj