Perl grep通过大文件匹配字符串

Perl grep通过大文件匹配字符串,perl,Perl,我有一个数组(@array),其中包含元素列表。我需要检查这些元素是否存在于主文件中。如果元素存在于主文件中,那么在主文件的同一行中,字符串YES(位于第5位)也应该存在。元素应该存储在不同的数组中 实际上,我的脚本使用两个grepshell命令来实现这一点。如何用Perl-do-grep编写同样的东西 ... use Data::Dumper; my @new_array; my @array = ('RT0AC1', 'WG3RA3'); print Dumper(\@array);

我有一个数组(
@array
),其中包含元素列表。我需要检查这些元素是否存在于主文件中。如果元素存在于主文件中,那么在主文件的同一行中,字符串
YES
(位于第5位)也应该存在。元素应该存储在不同的数组中

实际上,我的脚本使用两个
grep
shell命令来实现这一点。如何用Perl-do-grep编写同样的东西

...
use Data::Dumper;

my @new_array;
my @array = ('RT0AC1', 'WG3RA3');

print Dumper(\@array);

foreach ( @array ){
    my $line = `grep $_ "master_file.csv" | grep -i yes`;
    next unless($line);
    push( @new_array, $_ );
}

print Dumper(@new_array);
...
其中master_file.csv如下所示:

101,RT0AC1,CONNECTED,FAULTY,NO
102,RT0AC1,CONNECTED,WORKING,YES
103,RT0AC1,NOT CONNECTED,WORKING,NO
104,WG3RA3,NOT CONNECTED,DISABLED,NO
105,WG3RA3,CONNECTED,WORKING,NO
因此,这里我得到的
$line
值为
102,RT0AC1,已连接,正在工作,YES
,元素
RT0AC1
存储在
@new\u数组中


如何避免使用backtick(`)和两个grep来实现这一点。我正试图使用纯Perl实现这一点。另外,
master_file.csv
包含数百万条记录。

因为您要查找的所有单词都在同一位置,所以很容易用逗号分割当前行,查看哈希表中是否存在第二列,以及第五列是否等于
“YES”

#/usr/bin/env perl
严格使用;
使用警告;
使用自动模具;
使用数据::转储程序;
我的$filename=shift/“master_file.csv”;#默认文件名(如果命令行中未给出)
my@array=qw/RT0AC1 WG3RA3/;#你要找的词
我的%words=map{$\=>1}@array;#将它们存储在散列中以便快速查找
我的@new_数组;
#将Text::CSV_XS用于非平凡的CSV文件

打开my$csv,“因为您要查找的所有单词都在同一位置,所以很容易用逗号将当前行拆分,然后查看哈希表中是否存在第二列,以及第五列是否等于
“YES”

!/usr/bin/env perl
严格使用;
使用警告;
使用自动模具;
使用数据::转储程序;
my$filename=shift/“master_file.csv”#如果命令行中未给出默认文件名
我的@array=qw/RT0AC1 WG3RA3/;#您正在寻找的单词
我的%words=map{$\u=>1}@array;#将它们存储在哈希中以便快速查找
我的@new_数组;
#将Text::CSV_XS用于非平凡的CSV文件
打开我的$csv,“表单regex以匹配感兴趣的记录,将行拆分为字段,并将字段#5与YES进行比较。如果存在匹配项,则在
%match
散列中增加字段#2的计数

处理文件后,
%match
哈希将匹配记录字段#2作为键,值将反映此字段与文件中的YES匹配的次数

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my %match;
my @look_for = qw(RT0AC1 WG3RA3);
my $re_filter = join('|',@look_for);

while(<DATA>) {
    chomp;
    next unless /$re_filter/;
    my @data = split(',',$_);
    $match{$data[1]}++ if $data[4] eq 'YES';
}

say Dumper(\%match);

__DATA__
101,RT0AC1,CONNECTED,FAULTY,NO
102,RT0AC1,CONNECTED,WORKING,YES
103,RT0AC1,NOT CONNECTED,WORKING,NO
104,WG3RA3,NOT CONNECTED,DISABLED,NO
105,WG3RA3,CONNECTED,WORKING,NO
删除
数据
以获取最终代码,并在命令行上指定文件名,以处理包含感兴趣数据的文件

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my %match;
my @look_for = qw(RT0AC1 WG3RA3);
my $re_filter = join('|',@look_for);

while(<>) {
    chomp;
    next unless /$re_filter/;
    my @data = split(',',$_);
    $match{$data[1]}++ if $data[4] eq 'YES';
}

say Dumper(\%match);
形成正则表达式以匹配感兴趣的记录,将行拆分为字段,并将字段#5与YES进行比较。如果存在匹配项,则在
%match
散列中增加字段#2的计数

处理文件后,
%match
哈希将匹配记录字段#2作为键,值将反映此字段与文件中的YES匹配的次数

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my %match;
my @look_for = qw(RT0AC1 WG3RA3);
my $re_filter = join('|',@look_for);

while(<DATA>) {
    chomp;
    next unless /$re_filter/;
    my @data = split(',',$_);
    $match{$data[1]}++ if $data[4] eq 'YES';
}

say Dumper(\%match);

__DATA__
101,RT0AC1,CONNECTED,FAULTY,NO
102,RT0AC1,CONNECTED,WORKING,YES
103,RT0AC1,NOT CONNECTED,WORKING,NO
104,WG3RA3,NOT CONNECTED,DISABLED,NO
105,WG3RA3,CONNECTED,WORKING,NO
删除
数据
以获取最终代码,并在命令行上指定文件名,以处理包含感兴趣数据的文件

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my %match;
my @look_for = qw(RT0AC1 WG3RA3);
my $re_filter = join('|',@look_for);

while(<>) {
    chomp;
    next unless /$re_filter/;
    my @data = split(',',$_);
    $match{$data[1]}++ if $data[4] eq 'YES';
}

say Dumper(\%match);

您要查找的单词是否总是在csv文件的第二列?@Shawn是的。您要查找的单词是否总是在csv文件的第二列?@Shawn是的。谢谢@Shawn。在script.pl第17行第..
@vkkk05有一行没有逗号。对,有时空行或行包含没有逗号的行(单列数据)。我已在其中添加了这些行,而-
next if/^\s*$/;我的@F=split/,/;下一个,除非$F[1]谢谢@shawn。在script.pl第17行第..
@vkkk05有一行没有逗号。对,有时空行或行包含没有逗号的行(单列数据)。我已在其中添加了这些行,而-
next if/^\s*$/;我的@F=split/,/;下一个,除非$F[1]
use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my %match;
my @look_for  = qw(RT0AC1 WG3RA3);
my $re_filter = join('|',@look_for);
my $regex     = qr/^\d+,($re_filter),[^,]+,[^,]+,YES$/;

/$regex/ && $match{$1}++ for <DATA>;

say Dumper(\%match);

__DATA__
101,RT0AC1,CONNECTED,FAULTY,NO
102,RT0AC1,CONNECTED,WORKING,YES
103,RT0AC1,NOT CONNECTED,WORKING,NO
104,WG3RA3,NOT CONNECTED,DISABLED,NO
105,WG3RA3,CONNECTED,WORKING,NO