首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl文件操作

perl文件操作
EN

Stack Overflow用户
提问于 2012-05-23 09:45:21
回答 3查看 330关注 0票数 1

我有一个文件File1,它包含以下数据:

代码语言:javascript
复制
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

代码语言:javascript
复制
> NC_009066,1,0-17045,
GCTATCGTAGCTTAATTAAAGCATAACACTGAAGATGTTAAGATGAACCCTAGAAA

我已经将file1逐行放置在数组中,然后可以通过在/\s+/上拆分每一行来访问每一列。

代码语言:javascript
复制
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列……最好的办法是什么??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-23 12:25:37

首先,请注意,split的默认效果是在空格上拆分$_,丢弃前导和尾随空字段。最常见的情况是,这是您想要的,split /\s+/是不必要的。如果要在$_以外的变量上调用默认的拆分,则必须传递单个文字空间,而不是正则表达式,作为模式参数,例如split ' ', $line

我建议您首先使用map创建第二列和第三列中的数据数组。

然后你可以循环数据,提取开始值和结束值,并将基因从序列中提取出来。

代码如下所示

代码语言:javascript
复制
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,当您实际上是指AATTC时,substr('ATC', $start, $end - $start);会返回T

票数 2
EN

Stack Overflow用户

发布于 2012-05-23 10:39:55

你已经自己搞清楚了,你只是错误地使用了substrperldoc -f substr中的概要内容如下:

费用、偏移量、长度

但你给了它两个补偿。相反,将一个偏移量减去另一个偏移量,以计算正确的长度参数。

票数 1
EN

Stack Overflow用户

发布于 2012-05-23 11:52:01

使用二维数组:

代码语言:javascript
复制
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);

也见佩洛尔

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10717378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档