On Nov 20, 4:58 pm, [EMAIL PROTECTED] (John W. Krahn) wrote:
> marys wrote:
> > Hello:
>
> Hello,
>
> > Does anyone know how to use ‘awk’ in a script?
>
> perl and awk have a lot of similar features so its usually preferable to
> use perl in a perl program instead of awk.
>
> > It must have a
> > different syntax than the unix analog, as does the ‘grep’ command.
> > For grep, the syntax in the c-shell is:
> > “grep ‘string’ ,
>
> It's the same in every shell because grep is a standalone command.
>
> man grep
>
> > but for Perl the delimiters are slashes: $x = grep /
> > string/ line.
>
> That's because in perl grep is a built-in function.
>
> > Maybe the same thing is going on with Perl.
>
> > I have searched the following sources with no help on awk:
>
> > perldoc  -f   ‘awk’
> > ‘Beginning Perl’ by S. Cozen
> > ‘CGI101’
> > and the O’Reilly books:
> > ‘Learning Perl’ aka the llama book
> > ‘Intemediate Perl’
> > ‘Advanced Perl’
> > ‘CGI Programming with Perl’
>
> man awk
>
>
>
>
>
> > I have a file called /tmp/file.txt with one line:
>
> > field       xxxx
>
> > for grepping on xxxx, the script is:
>
> > #!/usr/bin/perl -w
> > use CGI::Carp qw(fatalsToBrowser);
> > use CGI qw(:standard -no_xhtml);
> > #use CGI ':standard';
> > use strict;
> > use diagnostics;
> > my $q = new CGI;
> > print $q->header;
> > print $q->start_html(-title=>"mygrep");
>
> > 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!";
> > system "chmod 755 /tmp/out.txt";
>
> perldoc -f chmod
>
> chmod 0755 '/tmp/out.txt' or warn "Cannot chmod '/tmp/out.txt' $!";
>
> > while ( defined(my $line=<FILEIN>) ){
>
> In a while loop conditional defined() is implied for a readline.
>
> >      chomp($line);
> >      push (@infile,$line);
> > }
>
> Or more simply:
>
> chomp( my @infile = <FILEIN> );
>
> > my @zoom = grep(/xxxx/,@infile);          #looks for 'xxxx' in @infile
>
> Why didn't you just test for /xxxx/ in the while loop, then you wouldn't
> need two arrays?
>
> > foreach (@zoom){
> >         print $q->center($q->h3("\nNext line containing 'xxxx' is:
> > \n"),
> >         $q->h3("$_\n"),
> >         $q->h3("_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _")  );
> > }
>
> Or print this as you found /xxxx/ in the while loop and you wouldn't
> need either array?
>
> > print $q->center($q->h2(" grep program is finished!\n"));
>
> grep is a built-in Perl funtion, not an external program.
>
> perldoc -f grep
>
> > The script works as it should for grep, but what if I want to output
> > $NF (=xxxx) when a line has the string  ‘field’ in it?  There must be
> > a way, but I can't find it.
>
> What does $NF contain?  I would guess that you want the line number
> where /xxxx/ was found?  If so:
>
> while ( my $line = <FILEIN> ) {
>      next unless /xxxx/;
>      print $q->center(
>          $q->h3( "\nNext line containing 'xxxx' is:\n" ),
>          $q->h3( $_ ),
>          $q->h3( "At line number: $." ),
>          $q->h3( '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _' )
>          );
>
> }
>
> John
> --
> Perl isn't a toolbox, but a small machine shop where you
> can special-order certain sorts of tools at low cost and
> in short order.                            -- Larry Wall- Hide quoted text -
>
> - Show quoted text -

Hello again:
Thanks very much to John and Owen for helping me.  I figured out I
didn't really need full-blown awk to do the awk-like thing I wanted to
do:
whenever a line from the infile has a particular string as the first
field, I need to know the last field.  The unix awk command uses $NF
for
the last field.  For my Perl script to do this, I needed to split each
element of the array that comes about from using <FILEIN>, and then
compare the first element to the string I am searching for, and if it
is a match, the last element of the array will be what I need.  For an
input file:

field1       xxxx
QQQQQQ       2222
field3       3333
QQQQQQ       4444          wowwow


The script is:

#!/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=>"mygrep");

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 script does a simple awk-like operation, but for powerful jobs
with multiple decisions it would be very difficult to write for an
unsophisticate like I am now.  Thank you for the tips and help.
Mary


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


Reply via email to