免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2459 | 回复: 4
打印 上一主题 下一主题

求大神帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-21 09:28 |只看该作者 |倒序浏览
最近在做组蛋白修饰的匹配情况,自己编了个程序但是运行较慢,所以相求大神帮忙
H3K18ac.bed
chr1        +   65092
chr1        +   65099
chr1    -   65099
chr1        +   65089
chr1        +        363660
chr1        +        857222
promoter.txt
OR4F5        NM_001005484        chr1         +        65091        73090
OR4F3        NM_001005224        chr1         +        363659        371658
SAMD11        NM_152486        chr1         +        857121        865120
NOC2L        NM_015658        chr1         -        875583        883582
KLHL17        NM_198317        chr1           +        891967        899966
PLEKHN1        NM_032129        chr1         +        897877        905876
令$cnt1=0想在H3K18ac.bed的第一列、第二列分别与promoter.txt第三列、第四列相同的情况下,如果(promoter.txt的第五列=<H3K18ac.bed的第三列<=promoter.txt的第六列时,$cnt会自增)
想要的结果如下
OR4F5        NM_001005484        chr1        +        65091        73090    2
OR4F3        NM_001005224        chr1        +        363659        371658   1
SAMD11        NM_152486        chr1        +        857121        865120   1
NOC2L        NM_015658        chr1        -        875583        883582   0
KLHL17        NM_198317        chr1        +        891967        899966   0
PLEKHN1        NM_032129        chr1        +        897877        905876   0
编写的程序如下:
#!/usr/bin/perl  -w
use strict;
use warnings;
open FILE, '<','H3K18ac.bed';      #启动子区域这个文件输入到FILE中                    
open AFILE, '<','promoter.txt';      #H3K18ac.bed文件输入到AFILE中     
open OUT,'>','readH3K18ac.bed';     #最后的结果输出到readH3K18ac.bed中
my @array1 = <FILE>;
my @array2 = <AFILE>;
foreach my $array1(@array1){
   chomp($array1);
   my @a1=split /\s+/,$array1;  #按空格键分割并存到数组@a1中
   my $cnt1=0;   #$cnt1=0
   foreach my $array2(@array2) {
    chomp($array2);
          my @a2 = split /\s+/,$array2;#按空格键分割并存到数组@a2中
            if ($a1[0] eq $a2[2] and $a1[1] eq $a2[3]){#在文件1第一列、第二列与文件2的第三列和第四列相同的情形下
             $cnt1++ if ($a1[2]>= $a2[4] and $a1[2] <= $a2[5]);#如果文件1的第三列大于等于文件2的第五列且小于等于文件2的第六列时,$cnt1会自增
                  }
         }print OUT "@a1 $cnt1\n"
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2015-01-21 14:03 |只看该作者
把数据文件发上来,估计你的数据文件很大吧?
要优化也是要看了文件之后,才好做出有针对性的优化.

论坛徽章:
0
3 [报告]
发表于 2015-01-21 16:40 |只看该作者
本帖最后由 13171082187 于 2015-01-21 16:46 编辑

回复 2# ntwarren


H3K18ac.bed的数据有点太大了,我上传了一个类似的文件 新建 好压 7Z 压缩文件.rar (2.56 MB, 下载次数: 7)

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-01-22 10:20 |只看该作者
本帖最后由 ntwarren 于 2015-01-22 10:22 编辑

用这个吧,在我的机器上大概13秒完成计算,前提是基于观察,你的数据是按数字递增的.如果没有递增的话,就先要排序

#!/usr/bin/perl  -w
use strict;
use warnings;

open FILE, '<','H3K4me1.bed';      #启动子区域这个文件输入到FILE中                    
open AFILE, '<','promoter.txt';      #H3K18ac.bed文件输入到AFILE中     
open OUT,'>','readH3K18ac.bed';     #最后的结果输出到readH3K18ac.bed中
my $t = time();

my @array1 = <FILE>;
my @array2 = <AFILE>;
my $i=0;

for my $array2 (@array2){
    chomp $array2;
    my @a2 = split /\s+/,$array2;
    my $cnt1 = 0;

    for(;$i<@array1;$i++){
        chomp $array1[$i];
        my @a1 = split /\s+/, $array1[$i];
        if($a1[2]>=$a2[4]){
            if( $a1[2]<=$a2[5]){
                $cnt1++ if $a1[0] eq $a2[2] and $a1[1] eq $a2[3];
            } else{
                last;
            }
        }
    }
    print OUT "@a2 $cnt1\n";
}


my $e = time();
print ($e - $t);


回复 3# 13171082187


   

论坛徽章:
0
5 [报告]
发表于 2015-01-22 20:15 |只看该作者
回复 4# ntwarren


    非常感谢大神了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP