免费注册 查看新帖 |

Chinaunix

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

谢谢toniz!问题已解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-26 18:22 |只看该作者 |倒序浏览
本帖最后由 bioinfor 于 2010-05-10 11:20 编辑

有一个以table键格开的文件,如下格式:
chromStart chromEnd  start  end  strand
100 200 110 220 +
150 300 50 280 -
100 270
300 500
......

chromStart和chromEnd为一数据范围,如果这一数据范围在start与end之间则将chromStart和chromEnd所代表的数据与start  end  strand所代表的数据输出来,如例子中chromStart 与chromEnd数据共4对,分别是100-200/150-300/100-270/300-500,则搜索start与end列可以得知100-200/100-270属于start与end列数据50-280 这一范围,而其它均不符合,则输出这一结果:

chromStart chromEnd  start  end  strand
100 200 50 280 -
100 270

注:chromStart chromEnd这两列的数据与 start end strand这三列的数据行数可能不一样,如上面的例子中chromStart和chromEnd这两列共四行数据:100 200/150 300/100 270/300 500 而start end strand这三列的数据只有两行:110 220 +/50 280 -


我在附件中列出输入的文件以及期望通过编程得到的结果,谢谢!

example.rar

491 Bytes, 下载次数: 62

输入的文件以及期望通过编程得到的结果

论坛徽章:
0
2 [报告]
发表于 2010-04-26 19:26 |只看该作者
我说一下思路,LZ可以自己试着解决。
首先,将文件中的数据提取到数组中(按行读取,再用split),获取start与end范围数组,再用循环判断chromStart和chromEnd是否在start与end之间。

论坛徽章:
0
3 [报告]
发表于 2010-04-26 23:39 |只看该作者
用PERL做很容易,数据量不大的话,全部读到内存算了,很快!

论坛徽章:
0
4 [报告]
发表于 2010-04-27 09:50 |只看该作者
回复 1# bioinfor


楼主与其到处求程序, 不如自己写一个, 根据你的描述, 应该是不难的, 加油!

论坛徽章:
0
5 [报告]
发表于 2010-04-27 10:15 |只看该作者
回复 1# bioinfor
{:3_195:}
  1. open F,"putest427.txt" or die "cant open file! ";
  2. my $k =<F>;
  3. my @chrom_start;
  4. my @chrom_end;
  5. my @start;
  6. my @end;
  7. my @strand;
  8. while($k =<F>){
  9.   my @k = split /\s+/,$k;
  10.   push @chrom_start,$k[0] if $k[0];
  11.   push @chrom_end,$k[1] if $k[1];
  12.   push @start,$k[2] if $k[2];
  13.   push @end,$k[3] if $k[3];
  14.   push @strand,$k[4] if $k[4];
  15. }

  16. foreach(1..@start){
  17.   my $start = shift @start;
  18.   my $end = shift @end;
  19.   my $strand = shift @strand;
  20.   my $flat=0;
  21.   foreach(0..@chrom_start-1){
  22.     if($chrom_start[$_]>$start and $chrom_start[$_]<$end and $chrom_end[$_]>$start and $chrom_end[$_]<$end  ){
  23.       if($flat == 0){
  24.         print "$chrom_start[$_] $chrom_end[$_] $start $end $strand\n";
  25.         $flat++;
  26.       }else{
  27.         print "$chrom_start[$_] $chrom_end[$_]\n";
  28.       }
  29.     }
  30.   }  
  31. }

复制代码

论坛徽章:
0
6 [报告]
发表于 2010-04-27 16:26 |只看该作者
太感谢toniz (肚腩照明月) 了! 你的程序很强大,我试用了一下没有问题,我的数据量比较大,有的可达几十万条数据,到时候实验了再来汇报。

我对perl不是很熟悉,自己试着弄了一下没有搞定。虽然这个程序看似可能简单,但问了一些人,也编了不少还真没有人编出来,这里高手还是多。

论坛徽章:
0
7 [报告]
发表于 2010-04-27 16:47 |只看该作者
已经5年没有再碰过perl了,连自己以前写的东西已经不认识了,看来程序要经常用才行,着急要用,所以麻烦大家了。

好多当年和我用perl的人转入python了,听说python要更优秀一些,但我还是喜欢perl,正如书的封皮一样,一只稳健的骆驼

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2010-04-28 09:27 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2010-04-29 09:36 |只看该作者
新人 也学习一下~~

论坛徽章:
0
10 [报告]
发表于 2010-05-08 20:29 |只看该作者
本帖最后由 bioinfor 于 2010-05-08 20:43 编辑

经过仔细的测试我才发现,这个程序还是有问题,不像大家想的比较容易实现,如提供如下例子:
chromStart        chromEnd        start        end        strand
784700        785513        0        80503        +
796721        797581        1052484        1152578        +
1084717        1085113        1053243        1153332        +
1122560        1123741        1054385        1154467        +
1156127        1156552        2994539        3094599        +
1185954        1186664        3427259        3527354        -
1213443        1213821        6439894        6539956        -
1303330        1303633        9161727        9261836        -
1310383        1310903        10237776        10337861        +
1357007        1357613        19173565        19273642        -
1398944        1399153        21264807        21364925        -
1400270        1401004        23139652        23239719        -
1485776        1486188        23320798        23420865        +
7156049        7157695                       
7200534        7201946                       
7240925        7241148                       
7250899        7251472                       
7274600        7275456                       
7278755        7279162                       
7279751        7280243                       
7297798        7298207                       
7309963        7310856                       
7313639        7313886                       
8999806        9000352                       
9004857        9005165                       
9053309        9054105                       
9059873        9060943                       
9068255        9069232                       
9075769        9076154                       
9091357        9091476                       
9096717        9097965                       
9121138        9121329                       
9136589        9137010                       
9178575        9179400                       
9200489        9200635                       
9240974        9241964       



使用toniz (肚腩照明月)朋友
输出的结果如下:
1084717 1085113 1053243 1152578 +
1122560 1123741
1084717 1085113 1054385 1153332 +
1122560 1123741



红色标记的符合要求的数值却没有输出出来,不知这是为什么?和数组有关吗? 还是由于数据量增大有关?
  1. open F,"putest427.txt" or die "cant open file! ";
  2. my $k =<F>;
  3. my @chrom_start;
  4. my @chrom_end;
  5. my @start;
  6. my @end;
  7. my @strand;
  8. while($k =<F>){
  9.   my @k = split /\s+/,$k;
  10.   push @chrom_start,$k[0] if $k[0];
  11.   push @chrom_end,$k[1] if $k[1];
  12.   push @start,$k[2] if $k[2];
  13.   push @end,$k[3] if $k[3];
  14.   push @strand,$k[4] if $k[4];
  15. }

  16. foreach(1..@start){
  17.   my $start = shift @start;
  18.   my $end = shift @end;
  19.   my $strand = shift @strand;
  20.   my $flat=0;
  21.   foreach(0..@chrom_start-1){
  22.     if($chrom_start[$_]>$start and $chrom_start[$_]<$end and $chrom_end[$_]>$start and $chrom_end[$_]<$end  ){
  23.       if($flat == 0){
  24.         print "$chrom_start[$_] $chrom_end[$_] $start $end $strand\n";
  25.         $flat++;
  26.       }else{
  27.         print "$chrom_start[$_] $chrom_end[$_]\n";
  28.       }
  29.     }
  30.   }  
  31. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP