【发布时间】:2013-12-31 02:10:08
【问题描述】:
我有一个大的 FASTA 文件(一个基因序列,一个完整的染色体),其中每行包含 50 个字符(碱基 a、g、t 和 c)。这个文件大约有 400 万行。
我想重新组织文件,以便将每行的每个字符放在新文件的自己的行中。也就是说,将原始文件中的每 50 个字符的行转换为 50 个单字符的行。这将导致整个序列重写为单个列。最终,我希望将序列作为单列,这样我就可以放置一个相邻的列,其中包含每个碱基的基因组坐标位置。
这就是我的做法,使用 perl 并创建一组 for 循环。
unless(@ARGV) {
# $0 name of the program being executed;
print "\n usage: $0 filename\n\n";
exit;
}
# use shift to pull off @ARGV value and return to $list;
my $fastafile = shift;
open(FASTA, "<$fastafile");
my @count =(<FASTA>);
close FASTA;
# print scalar @count;
for ( my $i = 0; $i < scalar @count ; $i ++ ) {
#print "$count[$i]\n\n\n\n";
my @seq = split( "", $count[ $i ] );
print " line = $i ";
for ( my $j = 0; $j < scalar @seq; $j++ ){
#my $count =
print "$seq[$j] for count = $j \n";
}
}
它似乎正在工作,但它很慢,非常慢。我想知道它是否因为 FASTA 文件有 400 万行而变慢,或者因为我的代码而变慢,或者两者兼而有之。我正在寻求建议以加快此过程。谢谢!
【问题讨论】:
-
你在用 fasta >header 做什么?
-
在
for循环之前,标头将被忽略。 -
你能解释一下你为什么要这样做吗?在我看来,这似乎是您试图以错误方式解决的问题之一,有点像您的问题是如何打开门,答案是使用钥匙,但您问的是如何从安全距离。
-
嗯,也许我理解错了,但输出目标实际上是“每行一个字符”还是“包含该字符的长字符串加上每行一个计数器”?
-
@carandraug,我最后想要的是一个双列文件,其中第一列是碱基,第二列是它的基因组坐标或碱基位置。该序列来自 UCSC 基因组浏览器。
标签: performance perl for-loop nested-loops bioinformatics