我正在尝试从大文本文件中删除多个字符(大约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;
提前致谢。
答案 0 :(得分:2)
您正在剥离字符,但您没有触及换行符。我认为你正在尝试的是:
s/n+//g;
那需要\n
。 chomp
不会做 - 只删除行尾的换行符。
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)