24小时热门版块排行榜    

查看: 1190  |  回复: 8

李靖

新虫 (初入文坛)

[求助] perl 大神求助 已有1人参与

亲们,我的两个文件是这样的
1文件chr1 - 9901.5                     
chr1 - 144612.5      
chr1 - 227317.5
chr1 - 227321.5
chr1 + 267647.5  
chr1 - 267648.5  
chr1 - 267649.5
chr2 + 267651.5
chr2 - 267652.5
chr3 - 521268.5
chr3 - 569831.5
chr1 + 713294.5  
chr1 - 713307.5  
chr1 - 753396.5
chr1 + 762732.5
chr3 - 801094.5  
chr1 + 808622.5
chr2 - 808633.5
chr1 - 819067.5
3文件
chr1 - 9802 144712   
chr1 - 227222 227421  
chr1 - 267552 267751
chr2 + 267552 267753
处理上边两个文件的预期目标是
chr1 - 9802 144712   3
chr1 - 227222 227421  2
chr1 - 267552 267751  2
chr2 + 267552 267753  0
我想在两个文件第一列和第二列相同的情况下,如果1文件的第三列有一个处于3文件的第三列和第四列之间的情况下,$n就加1。有两个就加2,以此类推,$n初始值为0.其中的3,2,2,0是$n.

my %hash;
my $n=0;
open OUTFILE,'>','result1';
open FILE,'<','1';
while (<FILE> {
  chomp;
  ($a,$b,$c)=(split)[0,1,2];
  $hash{$a}=1;
  $hash{$b}=2;
open FILE,'<','3';
while (<FILE>{
chomp;
  ($d,$e,$f,$g)=(split)[0,1,2,3];
  if(exists $hash{$d} && exists $hash{$e}){
          @array=sort{$a <=> $b}($f,$g);
          next if $c<$array[0] ;
          next if $c>$array[1];
          $n++;
}print OUTFILE"$d $e $f $g $n\n";
}
}

这是我编写的程序,大家能不能帮我看看是哪里出了问题啊或者帮我重新编写一个,甚是感谢各位大牛了。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wizardfan

至尊木虫 (著名写手)

优秀版主

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
李靖: 金币+15, 有帮助 2014-11-25 09:42:42
首先先让我理解你的算法:
根据你说的
chr1 - 9802 144712
第3,4列是9802和144712,那区间就是9802-144712
在1文件中,只有第二行chr1 - 144612.5      在这个区间,那你的结果为什么是3呢?

其次,请确定1文件和3文件的分割符是空格,还是tab

接着 看上去第二列的正反链信息好像没有用的

最后 请在你的程序上加上注释,我可以帮你看看,你到底错在哪里: 是算法错误,还是perl实现错误
2楼2014-11-10 17:36:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

李靖

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by wizardfan at 2014-11-10 17:36:47
首先先让我理解你的算法:
根据你说的
chr1 - 9802 144712
第3,4列是9802和144712,那区间就是9802-144712
在1文件中,只有第二行chr1 - 144612.5      在这个区间,那你的结果为什么是3呢?

其次,请确定1 ...

不好意思,昨天把1文件上传错了,如果按一文件的话,预期的目标是
chr1 - 9802 144712  2
chr1 - 227222 227421  2
chr1 - 267552 267751  2
chr2 + 267552 267753  1
我解释一下,我想干什么(上边文件1的最开头还有一行chr1 - 9901.5 ),我另$n的初始值为0,如果文件1的第三列有落在文件三的第三列和第四列之间,那么$n就加1,以此类推,
chr1 - 9901.5                     
chr1 - 144612.5  
如上边两行的第三列都在9802  144712 之间,所以$n就为2.同样下边也是这样的也就是生物中数read个数。可以帮我编写一个也是可以的,因为帮别人改程序确实很麻烦的,非常感谢
3楼2014-11-11 08:34:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wizardfan

至尊木虫 (著名写手)

优秀版主

引用回帖:
3楼: Originally posted by 李靖 at 2014-11-11 08:34:54
不好意思,昨天把1文件上传错了,如果按一文件的话,预期的目标是
chr1 - 9802 144712  2
chr1 - 227222 227421  2
chr1 - 267552 267751  2
chr2 + 267552 267753  1
我解释一下,我想干什么(上边文件1的最开 ...

我自己写很简单,但是你学到的少。更倾向于你说下你的算法。
比如
读入文件1,每行分成3列,保存到hash变量里,key是***,value是***

如果你编程经验不丰富的话,做这么一步会很有帮助
4楼2014-11-11 08:39:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

李靖

新虫 (初入文坛)

#!/usr/bin/perl  -w
use strict;
use warnings;
open FILE, '<','3';                          
open AFILE, '<','1';           
open OUT,'>','result';  
my @array1 = <FILE>;
my @array2 = <AFILE>;
my @b;
foreach my $array1(@array1){
   chomp($array1);
   my @a1=split /\s+/,$array1;  
   my $cnt1=0;
   foreach my $array2(@array2) {
    chomp($array2);
          my @a2 = split /\s+/,$array2;
            if ($a1[0] eq $a2[0] and $a1[1] eq $a2[1]){
                   @b=sort{$a<=>$b}($a1[2],$a1[3]);
             $cnt1++ if ($a2[2]>= $b[0] and $a2[2] <= $b[1]);
                  }
         }print OUT "@a1 $cnt1\n"
}
亲,我自己改写变出来了,不过我感觉运行很慢,能不能帮我修改一下
5楼2014-11-11 08:54:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

李靖

新虫 (初入文坛)

引用回帖:
4楼: Originally posted by wizardfan at 2014-11-11 08:39:55
我自己写很简单,但是你学到的少。更倾向于你说下你的算法。
比如
读入文件1,每行分成3列,保存到hash变量里,key是***,value是***

如果你编程经验不丰富的话,做这么一步会很有帮助...

my %hash;
my $n=0;
open OUTFILE,'>','result1';
open FILE,'<','1';
while (<FILE> {
  chomp;
  ($a,$b,$c)=(split)[0,1,2];
  $hash{$a}=1;
  $hash{$b}=2;
open FILE,'<','3';
while (<FILE>{
chomp;
  ($d,$e,$f,$g)=(split)[0,1,2,3];
  if(exists $hash{$d} && exists $hash{$e})#这一行的意思是,我想同时存在一文件的第一列和第二列{
          @array=sort{$a <=> $b}($f,$g);#因为有正负链的原因,所以我将3文件的第三列和第四列进行了一下重新排序
          next if $c<$array[0] ;
          next if $c>$array[1];#将不在这个区间的所有$c给除去
          $n++; #有多少个$c就$n就为多少
}print OUTFILE"$d $e $f $g $n\n";
}
}
6楼2014-11-11 09:03:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wizardfan

至尊木虫 (著名写手)

优秀版主

【答案】应助回帖

引用回帖:
5楼: Originally posted by 李靖 at 2014-11-11 08:54:19
#!/usr/bin/perl  -w
use strict;
use warnings;
open FILE, '<','3';                          
open AFILE, '<','1';           
open OUT,'>','result';  
my @array1 = <FILE>;
my @arr ...

为什么不能听我的建议,先写算法,再写程序呢?!

算法1
针对文件1中的每一行,读一遍文件3,看在不在区间内

算法2
针对文件1中的每一行,根据染色体分组
针对文件3中的每一行,根据染色体分组
针对文件1中的每一条染色体,找到对应的文件3中的染色体分组,然后进行分析

你看下,两个算法哪个算法速度会更快?
7楼2014-11-11 09:34:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

李靖

新虫 (初入文坛)

引用回帖:
7楼: Originally posted by wizardfan at 2014-11-11 09:34:48
为什么不能听我的建议,先写算法,再写程序呢?!

算法1
针对文件1中的每一行,读一遍文件3,看在不在区间内

算法2
针对文件1中的每一行,根据染色体分组
针对文件3中的每一行,根据染色体分组
针对文件 ...

谢谢
8楼2014-11-25 09:43:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

李靖

新虫 (初入文坛)

引用回帖:
4楼: Originally posted by wizardfan at 2014-11-11 08:39:55
我自己写很简单,但是你学到的少。更倾向于你说下你的算法。
比如
读入文件1,每行分成3列,保存到hash变量里,key是***,value是***

如果你编程经验不丰富的话,做这么一步会很有帮助...

谢谢
9楼2014-11-25 09:44:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 李靖 的主题更新
信息提示
请填处理意见