Perl文本文件grep

时间:2014-05-26 22:47:01

标签: arrays perl text grep

我想在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的内存)。

感谢您提供任何先进的帮助/建议!欢呼声。

3 个答案:

答案 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);