【问题标题】:Perl text file grepPerl 文本文件 grep
【发布时间】:2014-05-26 22:47:01
【问题描述】:

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

感谢您提供任何帮助/建议!干杯。

【问题讨论】:

    标签: arrays perl text grep


    【解决方案1】:

    使用 perl 单行。只需将您的数字列表转换为正则表达式即可。

    perl -ne 'print if /\b(?:10060|10841|11164)\b/' file.txt > newfile.txt
    

    【讨论】:

    • 谢谢;但是,每当我尝试这个时,它都不起作用。如果我把10841放在第一位,那么它确实会将它添加到新文件中,但不是11164。我也试过 >> 而不是 > 并没有区别......
    【解决方案2】:

    您可以使用像/(10060\t|100841\t|11164\t)/ 这样的正则表达式来搜索替代方案。由于您的数组可能很大,您可以通过类似

    的方式创建此正则表达式
    $searchRegex = '(' + join('|',@searchArray) + ')';
    

    这只是一个简单的字符串,因此最好(更快)将其编译为正则表达式

    $searchRegex = qr/$searchRegex/;
    

    只有 500 万行,您实际上可以将整个文件拉入内存(如果 100 个字符/行,则小于 1 GB),但除此之外,您可以使用此模式逐行搜索

    while (<>) {
        print if $_ =~ $searchRegex
    }
    

    【讨论】:

    • 谢谢!你会如何建议加载/我在哪里输入和输出文本文件?不幸的是,每行实际上很长,文件约为 20Gb,因此内存是一个因素。
    • 不要在文件的输入和输出中添加语句!这是不好的做法。
    【解决方案3】:

    所以我不是最好的编码员,但这应该可行。

    #!/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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多