On Sun, Aug 8, 2010 at 20:40, Jim Green <student.northwest...@gmail.com> wrote:
> Hi,
> I used to use find, a for loop and awk to extract data from a list of
> files returned by find.
>
> Now I want to use file::find  and perl to this.
>
>  use vars qw/*name *dir *prune/;
>  *name   = *File::Find::name;
>  *dir    = *File::Find::dir;
>  *prune  = *File::Find::prune;
>
>  my $directories_to_seach="/home/jim";
>
>
>  sub wanted;
>
>  # Traverse desired filesystems
>  File::Find::find({wanted => \&wanted}, $directories_to_seach);
>  exit;
>
>  sub wanted {
>  /regex/s
>     && print("$name\n");
>  }
>
> my question is how to do in a native, elegant perl way for my bash
> script?
>
> for file in `find . -name "*pattern*"`
> do
>    zcat $file|awk '$2 == "BP" {print $17 $18}'|\
>    echo
> done
>
>
> Thank you!
>
> Jim

The Perl 5 core way:

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;

find sub {
        return unless -f and /pattern/;
        open my $fh, "-|", "zcat", $File::Find::name
                or die "could not open $File::Find::name: $!\n";
        while (<$fh>) {
                #splits on zero or more whitespace by default
                my @fields = split;
                next unless $fields[1] eq "BP";
                print "@fields[16, 17]\n";
        }
}, ".";

The CPAN way:

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;
use PerlIO::gzip;

find sub {
        return unless -f and /pattern/;
        open my $fh, "<:gzip", $File::Find::name
                or die "could not open $File::Find::name: $!\n";
        while (<$fh>) {
                #splits on zero or more whitespace by default
                my @fields = split;
                next unless $fields[1] eq "BP";
                print "@fields[16, 17]\n";
        }
}, ".";

-- 
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to