我有一个文件File1,它包含以下数据:
NC_009066 5239 5308 trnA(tgc) 2.10899859667e-09 -
NC_009066 5309 5382 trnN(gtt) 7.03000463545e-10 -
NC_009066 5422 5487 trnC(gca) 7.09999799728e-08 -
NC_009066 5487 5557 trnY(gta) 3.72200156562e-11 -
NC_009066 5549 7097 cox1 291081744.81 +
NC_009066 7109 7180 trnS2(tga) 1.83000043035e-09 -
NC_009066 7183 7256 trnD(gtc) 2.5720000267e-09 +和另一个fasta文件File2
> NC_009066,1,0-17045,
GCTATCGTAGCTTAATTAAAGCATAACACTGAAGATGTTAAGATGAACCCTAGAAA我已经将file1逐行放置在数组中,然后可以通过在/\s+/上拆分每一行来访问每一列。
for $line(@array){
@column= split(/\s+/,$line);
# print $column[5]."\n";
$gene=substr($seq,$column[1],$column[2]);#$seq extracted from File2....}但是我想做的是从第1行取第2列,从第2行(substr($seq,5239,5382))取第3列,从第2行取第2列,从第3行(substr($seq,5309,5487))取第3列……最好的办法是什么??
发布于 2012-05-23 12:25:37
首先,请注意,split的默认效果是在空格上拆分$_,丢弃前导和尾随空字段。最常见的情况是,这是您想要的,split /\s+/是不必要的。如果要在$_以外的变量上调用默认的拆分,则必须传递单个文字空间,而不是正则表达式,作为模式参数,例如split ' ', $line。
我建议您首先使用map创建第二列和第三列中的数据数组。
然后你可以循环数据,提取开始值和结束值,并将基因从序列中提取出来。
代码如下所示
use strict;
use warnings;
open my $fh, '<', 'f1.txt' or die $!;
my @data = map [ (split)[1,2] ], <$fh>;
my $seq = 'GCTATCGTAGCTTAATTAAAGCATAACACTGAAGATGTTAAGATGAACCCTAGAAA';
for my $i (1 .. $#data) {
my ($start, $end) = ( $data[$i-1][0], $data[$i][1] );
my $gene = substr($seq, $start, $end - $start);
print "$gene\n";
}注意,循环在索引1 (数组的第二个元素)到$#data (最后一个元素)之上。这是因为循环的主体将前一个元素的第一列和当前元素的第二列作为对,并且在第一个元素之前没有元素。
还要注意的是,您可能必须将参数调整为substr,因为我不知道您的索引是从0开始还是从1开始,或者它们是否包含该索引中的字符。
例如,对于$start = 1; $end = 2,当您实际上是指A、AT或TC时,substr('ATC', $start, $end - $start);会返回T。
发布于 2012-05-23 10:39:55
你已经自己搞清楚了,你只是错误地使用了substr。perldoc -f substr中的概要内容如下:
费用、偏移量、长度
但你给了它两个补偿。相反,将一个偏移量减去另一个偏移量,以计算正确的长度参数。
发布于 2012-05-23 11:52:01
使用二维数组:
for (my $i = 0; $i < scalar(@array); ++$i) {
$$table[$i] = [ split(/\s+/,$array[$i]) ];
}
# you may put this into a loop
$start = $$table[0][1];
$end = $$table[1][2] - $$table[0][1];
$gene = substr($seq, $start, $end);也见佩洛尔。
https://stackoverflow.com/questions/10717378
复制相似问题