On Nov 21, 4:47 pm, [EMAIL PROTECTED] (Owen) wrote:
> On Fri, 21 Nov 2008 03:41:21 -0500
>
>
>
>
>
> "michael spellman" <[EMAIL PROTECTED]> wrote:
> > On Thu, Nov 20, 2008 at 8:32 PM, Owen <[EMAIL PROTECTED]> wrote:
>
> > > On Thu, 20 Nov 2008 06:32:51 -0800 (PST)
> > > marys <[EMAIL PROTECTED]> wrote:
> > > I am not altogether certain what you are trying to achieve.
>
> > > Read up on $.  (See perldoc perlvar) That gives you the line number
> > > that you are reading.
>
> > > Also I think you night be better off using a regex.
>
> > > if ($line =~ /xxxx/}{print "$. $line\n"};
>
> > > This gives you the opportunity to get matches as well as pre and
> > > post matches
>
> > > If you want to do awk type things, have a read of perldoc English
> > Thank you for the advice.
>
> > I want to look in all lines in a many-line document, and if the line
> > contains a particular string, like maybe 'QQQ', I want to take the
> > next-to-last string from that line and assign a variable name $x to
> > it.
>
> > A unix-like command to do the job on one line would be:
> > my $x = ` awk  '/QQQ/{ print $(NF-1) }'  `
>
> > Then if I had lines in the file like
>
> > QQQ   1 2 t horseradish 65
> > QQQ 24 65 18
> > rr  QQQ wowmom 18
>
> > I would get, after line#1    $x=horseradish
> > and after line #2   $x=65
> > and after line #3  $x=wowmom
>
> > One thing I might be able to do is to pull in one line at a time into
> > an array with the 'diamond operator' in the llama book and then
> > somehow split on whitespace at each value of that array, put the
> > resulting list into another array, and search this second array,
> > position by position, for 'QQQ'.  If any of the positions match, I
> > could get the second-last word on that line from ($#array -1) somehow.
> > But there are obvious problems here: for one thing, I need to
> > surround the values with a quote, for example I need $x='horseradish'
> > or else Perl will tell me it can't do the job.  Plus I am not sure
> > how to put the results of split into an array.  But I am sure that's
> > do-able.  It's a learning experience for sure.
>
> > Thank you very much for the help.
>
> You need to run something like this. Adapt to your requirements
>
> ============================================================
> #!/usr/bin/perl -w
>
> use strict;
>
> while (<DATA>) {
>     my $line = $_;
>     if ( $line =~ /QQQ/ ) {
>         my @bits = split;
>         print "$bits[$#bits -1]\n";
>
>     }
>
> }
>
> __DATA__
> QQQ   1 2 t horseradish 65
> QQQ 24 65 18
> rr  QQQ wowmom 18
>
> ============================================================
>
> horseradish
> 65
> wowmom
>
> ============================================================- Hide quoted 
> text -
>
> - Show quoted text -


I guess I don't need awk for the job I described, only a lot of array
reading and manipulating.  If I have an input file:

field1       xxxx
QQQQQQ       2222
field3       3333
QQQQQQ       4444          hahaha



and I want to find all lines containing the string QQQQQQ and then
print out to a screen the last item on those lines, I've got to use
the approach Owen wrote about above, where I first split and then
successively test each field of each line to see if it matches, and if
so I follow with a print of  the last field:

#!/usr/bin/perl -wT
use CGI::Carp qw(fatalsToBrowser);
use CGI ':standard';
use strict;
use diagnostics;
my $q = new CGI;
print $q->header;
print $q->start_html(-title=>"myawk");

my @infile;
my $q = new CGI;
open (FILEIN, "/tmp/file.txt") or die "Can't open /tmp/file.txt for
reading: $!\n!";
open (FILEOUT, ">/tmp/out.txt") or die "Can't open /tmp/out.txt for
writing: $!\n!";
chmod 0755, '/tmp/out.txt' or warn "Cannot chmod '/tmp/out.txt': $!
\n!";

chomp(my @linesarray = <FILEIN>);

my @splitline;
foreach (@linesarray){
               @splitline=split; #array is a split-up line from the
input file

       if ($splitline[0] eq 'QQQQQQ'){
       my $lastfield = $splitline[$#splitline];
               print $q->center($q->h3("\$lastfield is $lastfield
\n"));
       }
}

my [EMAIL PROTECTED];

print $q->center($q->h2(" awk program is finished!\n"));

This gives a centered output at the browser:

 
$lastfield is 2222
 
$lastfield is hahaha
                                                                awk
program is finished!


This was a good learning experience, and the job is done, but it was a
fairly simple task that took ~20 lines of code.  I think there is a
Perl resource somewhere that does awk jobs with one or two commands.
Maybe a module.

I want to thank Owen and John for their advice and all the pointers on
syntax also.
Mary


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


Reply via email to