in reply to awk like question in perl

That looks like fixed-width data. Use unpack (I think the documentation for unpack templates is under pack.

You can also split on whitespace (so it seems), and take a slice of the 2nd and 6th items from the return list. But for fixed-column-width input, I would prefer the reliability of unpack.


Dave

Replies are listed 'Best First'.
Re^2: awk like question in perl
by VSarkiss (Monsignor) on Aug 11, 2004 at 19:31 UTC

    I agree that it looks like fixed-width, for which the tools of choice are pack and unpack. But the default behavior in awk is to split on whitespace, so split is more likely to do what the OP wanted.

      I kind of figured splitting on whitespace was the original objective, but I suggested unpack as what I thought might be a better alternative. However, split is pretty simple to use, so here's an example that pulls out the 2nd and 6th fields:

      { local $, = "\t"; print +(split)[1,5], $/ while <DATA>; }

      HTH!


      Dave

        great thanks alot! You rock! I asked the email list at beginners@perl.org and I received no responses. Anyway I have two questions related to my desired output. 1) from my code I am getting these errors Filehandle FOO opened only for output at derek line 23, <FOO> line 39. 08/09/04 11:02:43 E01220 Filehandle FOO opened only for output at derek line 23, Here is my code:
        ## Define ENV $ENV{"PATH"} = qq(/usr/epoch/bin:/usr/epoch/EB/bin:/usr/bin:/usr/sbin: +/bin:/sbin); delete $ENV{"IFS"}; ## Declare scalers for client templates and client tape logs my $scratches="/usr/local/log/scratch_tapes.log"; my $logf="/usr/epoch/EB/log/ebcat.log"; ## Gather data for scratch tapes; open file, create array list, then p +rint it. open (FOO, ">$scratches") || die "could not open file:$!"; my $scratch_list = `grep 9840S $logf |grep "ebexpire, ebexpire +"`; print FOO "$scratch_list"; while (<FOO>) { local $, = "\t"; print +(split)[0,1,5], $/; } close (FOO);
        can anyone shed some light? Also to use the Perl grep I have code as follows but it is not working.
        ## Define ENV $ENV{"PATH"} = qq(/usr/epoch/bin:/usr/epoch/EB/bin:/usr/bin:/usr/sbin +:/bin:/sbin); delete $ENV{"IFS"}; ## Declare scalers for client templates and client tape logs my $scratches="/usr/local/log/scratch_tapes.log2"; my $logf="/usr/epoch/EB/log/ebcat.log"; open (FOO, ">$scratches") || die "could not open file:$!"; open (D, "$logf") || die "could not open file:$!"; while ( <D> ) { if (( /9840S/ ) && ( /"ebexpire, ebexpire"/ )) { print $_ $scratches } } close (FOO); close (D);
        2 example lines from the ebcat.log looks like 04/29/04 11:01:17 6687:ebexpire, ebexpire.c@7475 E01012 9840S 820 6E01C1874C2E12CA 04/29/04 11:01:17 6687:ebexpire, ebexpire.c@7475 E01093 9840S 898 9601C7263CDC2B34 thank you!
        so... is the code
        print +(split)[1,5], $/ while <DATA>;
        saying "split <DATA> on the 1st and 5th fields as IRS's for output? But what does the +(split) mean? thanks!