使用perl删除大文件中的多个字符

时间:2015-03-24 10:13:04

标签: regex perl

我正在尝试从大文本文件中删除多个字符(大约1GB)。该文件大致包含如下:

>chr1
NNNNNNNNNNNNN
NNNNNNATGGGGA
NNNNNNNNNNNNN
AGCGTAGGCGACG

>chr2
NNNNNNNNNNNNN
ATGCGTAGCGCAT
NNNNNNNNGCATG
CGATGCTAGctag
cgatcgagcgatg

我想只获取'ATCG'字符并希望连接所有字符串,所以它应该如下所示:

ATGGGGAAGCGTAGGCGACGATGCGTAGCGCATGCATGCGATGCTAGCTAGCGATCGAGCGATG

不幸的是,所有不需要的字符都变成了空白,就像这样:

ATGGGGA


AGCGTAGGCGACG


ATGCGTAGCGCAT

我错过了什么吗?这是我的代码:

open FH, "<", 'filename' or die "Can't open\n"; #read the file

while (my $load = sysread (FH, $temp, 1e+8)) {
    warn "Read $load bytes\n";

    $temp =~ s/>chr+//gi;
    $temp =~ s/\d+//g;
    $temp =~ s/n+//gi;

    chomp($temp);
    $process .= uc($temp);
    $temp = '';
}

open (FH, ">", 'newfile') or die "Can't create\n"; #processed string in new file

print FH $process;
close FH;

提前致谢。

2 个答案:

答案 0 :(得分:2)

您正在剥离字符,但您没有触及换行符。我认为你正在尝试的是:

s/n+//g; 

那需要\nchomp不会做 - 只删除行尾的换行符。

s/chr+//g;

也不会做你想要的 - 那就是ch然后是one or more instances of "r"

鉴于你的文件中有换行符,你有什么特别的理由需要一次性阅读全部内容吗?我建议:

#!/usr/bin/perl
use strict;
use warnings;

open ( my $input, "<", "input_file_name" ) or die $!;
open ( my $output, ">", "output_file_name" ) or die $!;
while ( my $line = <$input> ) {
    next if $line =~ m/^>/; 
    $line =~ s/[^ATCG]//gi; 
    print {$output} $line;   #NB - no linefeeds at all. 
}

close ( $input );
close ( $output ); 

给出:

ATGGGGAAGCGTAGGCGACGATGCGTAGCGCATGCATGCGATGCTAGCTAG

答案 1 :(得分:0)

最简单的方法是

tr -cd ATCG < input > output

tr。或者在perl

perl -pe'y/ATCG//cd' input > output

请参阅-pe有关y//含义的perlrun文档以及cd和{{1}}修饰符的perlop