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