in reply to Re: regarding file from the directory and executing some commands and placing the out put on exceel sheet.
in thread regarding file from the directory and executing some commands and placing the out put on exceel sheet.

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

  • Comment on Re^2: 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^3: 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 09:00 UTC

    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
Re^3: 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 12:41 UTC
    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
      Hi,

      sorry for the confusion

      Gkel_check.1.ABC.dat.gz Gkel_check.1.ABC.dat check.1.ABC_TT1.dat check.1.AB_TT1.dat
      if (($file=~ m/^Gkel_/) && (substr($file, -2) eq 'gz')) { my $result = `gunzip -c $file|tail -1`; $Count = substr($result,22,8); system(`gunzip -f $file`); $Orig_file = $file;

      The above condition i am using to fetch the files starts with Gkel_ abd ends with gz

      fetch the zip file and execute tail command to get the count

      and execute gunzip to uncompress the file, here i will take the file name and count

      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++;

      The above code to fetch the two files check.1.ABC_TT1.dat and check.1.AB_TT1.dat

      execute the wc -l to get the count here also i will take the file name and count

      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); $Orig_file1 = $file_name; $Count1 = $count; system(`mv $file $file1`); } }

      The above code will take the unzipped file Gkel_check.1.ABC.dat and

      and move the file from Gkel_check.1.ABC.dat to check.1.ABC.dat

      execute the wc -l to get the count here also i will take the file name and count

      Output what i am expecting is:

      June-2013 Gkel_check.1.ABC.dat.gz count check.1.ABC_TT1.dat count chec +k.1.ABC.dat.gz count

      This is the first line the above output should contain a line with zip file name and its count

      Then check.1.ABC_TT1.dat and its count and unzipped file name and count

      check.1.AB_TT1.dat

      In second line i need just only check.1.AB_TT1.dat file name and its count

      regards,
        I understand now why you had 2 loops.
        Try this, as before replace #test lines with your lines marked ##
        #!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 check.1.ABC_TT1.dat check.1.AB_TT1.dat ); #test ##opendir( DIR, $dir ); ##my @files = grep( /$pattern/, readdir(DIR) ); ##closedir(DIR); ##chdir($dir); # sort so that AB_ comes after ABC foreach my $file (sort @files) { # check gz file if ( ($file =~ m/^Gkel_/) && ($file =~ m/gz$/) ){ ## my $result = `gunzip -c $file|tail -1`; ## my $count = substr($result,22,8); my $count = 108418; #test $Gkel_gz[0] = $file; $Gkel_gz[1] = $count; # extract .dat file ## system(`gunzip -f $file`); } # check TT1 files 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]; } } # process extracted file ##opendir( DIR, $dir ); ##my @files = grep( /$pattern/, readdir(DIR) ); ##closedir(DIR); ##chdir($dir); push @files,'Gkel_check.1.ABC.dat'; #test foreach my $file (@files) { # extracted file if ( ($file =~ m/^Gkel_/) && ($file !~ m/gz$/) ){ #my $result = `wc -l $file`; #my ($count, $file_name) = split(' ',$result); my $count = 107948; # remove Gkel from filename my $file1 = substr($file,5,50); $Gkel[0] = $file; $Gkel[1] = $count; #system(`mv $file $file1`); } } # Ouput my @row1 = ('Jun-2013', # $Gkel_gz[0],$Gkel_gz[1], # zip filename and count $TT1[0]->[0],$TT1[0]->[1], # ABC_TT filename and count $Gkel[0],$Gkel[1] # unzipped filename and count ); my @row2 = ( $TT1[1]->[0],$TT1[1]->[1] # AB_TT filename and count ); print join ',',@row1,"\n"; print join ',',@row2,"\n";
        poj