让我首先说您的问题描述并没有那么有帮助。下一次,请更具体一点:您可能会错过更好的解决方案。
因此,根据您的描述,我了解到您有两个包含空格分隔数据的文件。在第一个文件中,您希望将前三列与某个搜索模式进行匹配。如果找到,您想查找另一个文件中包含第一个文件中匹配行的第四列和第五列的所有行。从这些行中,您需要提取第二列和第三列,然后打印第一个文件的第一列以及第二个文件的第二列和第三列。好的,这里开始:
#!/usr/bin/env perl -nwa
use strict;
use File::Find 'find';
my @search = qw(X Y Z);
# if you know in advance that the otherfile isn't
# huge, you can cache it in memory as an optimization.
# with any more columns, you want a loop here:
if ($F[0] eq $search[0]
and $F[1] eq $search[1]
and $F[2] eq $search[2])
{
my @files;
find(sub {
return if not -f $_;
# verbatim search for the columns in the file name.
# I'm still not sure what your file-search criteria are, though.
push @files, $File::Find::name if /\Q$F[3]\E/ and /\Q$F[4]\E/;
# alternatively search for the combination:
#push @files, $File::Find::name if /\Q$F[3]\E.*\Q$F[4]\E/;
# or search *all* files in the search path?
#push @files, $File::Find::name;
}, '/search/path'
)
foreach my $file (@files) {
open my $fh, '<', $file or die "Can't open file '$file': $!";
while (defined($_ = <$fh>)) {
chomp;
# order of fields doesn't matter per your requirement.
my @cols = split ' ', $_;
my %seen = map {($_=>1)} @cols;
if ($seen{$F[3]} and $seen{$F[4]}) {
print join(' ', $F[0], @cols[1,2]), "\n";
}
}
close $fh;
}
} # end if matching line
与另一个包含大量系统调用的发布者的解决方案不同,这根本不会退回到 shell,因此应该足够快。