我想在Perl中创建一个字符串数组,我需要从制表符分隔的文本文件中搜索/ grep。例如,我创建了数组:
#!/usr/bin/perl -w
use strict;
use warnings;
# array of search terms
my @searchArray = ('10060\t', '10841\t', '11164\t');
我希望foreach
循环到grep
一个文本文件,其格式如下:
c18 10706 463029 K
c2 10841 91075 G
c36 11164 . B
c19 11257 41553 C
对于上述数组的每个元素。最后,我想要一个看起来像这样的新文本文件(继续这个例子):
c2 10841 91075 G
c36 11164 . B
我该怎么做呢?此外,这需要能够处理大约500万行的文本文件,因此不能浪费内存(我确实有32GB的内存)。
感谢您提供任何先进的帮助/建议!欢呼声。
答案 0 :(得分:2)
使用perl单线程。只需将您的数字列表翻译成正则表达式。
perl -ne 'print if /\b(?:10060|10841|11164)\b/' file.txt > newfile.txt
答案 1 :(得分:1)
您可以使用/(10060\t|100841\t|11164\t)/
等正则表达式搜索替代品。由于您的数组可能很大,您可以通过
$searchRegex = '(' + join('|',@searchArray) + ')';
这只是一个简单的字符串,因此将它编译为正则表达式会更好(更快)
$searchRegex = qr/$searchRegex/;
只有500万行,你实际上可以将整个文件拉入内存(如果是100个字符/行,则不到一千兆字节),但除此之外,你可以逐行搜索这个模式,如
while (<>) {
print if $_ =~ $searchRegex
}
答案 2 :(得分:0)
所以我不是最好的编码员,但这应该有效。
#!/usr/bin/perl -w
use strict;
use warnings;
# array of search terms
my $searchfile = 'file.txt';
my $outfile = 'outfile.txt';
my @searchArray = ('10060', '10841', '11164');
my @findArray;
open(READ,'<',$searchfile) || die $!;
while (<READ>)
{
foreach my $searchArray (@searchArray) {
if (/$searchArray/) {
chomp ($_);
push (@findArray, $_) ;
}
}
}
close(READ);
### For Console Print
#foreach (@findArray){
# print $_."\n";
#}
open(WRITE,'>',$outfile) || die $!;
foreach (@findArray){
print WRITE $_."\n";
}
close(WRITE);