免费注册 查看新帖 |

Chinaunix

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

求教如何快速截取一个较长序列中的几段序列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-27 08:44 |只看该作者 |倒序浏览
假设已知一个数组@allcdss=(2,8,12,16,18,25,28,35);
已知一个文件,(只是举例,这个文件大约有上亿个字母),如下:
>chr5
AGAACAATATCTCTGATGAACATAGATGCAAAAATCCTCAACAACATACTAGCTAAATAATCCAACAACT
CATCAAAAGGATAATACACCATGATCAAGTGGGTTCATCCTAGAGATGCAGGGATGGTTTAACACATGCA
AGTCAATAAATATGATACATCACATAAACGGAATTAAAACAAAAACCACATGATCATCTCAATAGATGCA
GGAAAAGCATTTGATAAAATCTAGCAGCCCTTTATGATAAAACCCCTCAAGAAACTAGGTAAAGAAGGGG



想要的结果是根据数组内的值,截取中间的序列。2-8, 12-16, 18-25, 28-35,共四段,然后连接起来,
预计结果是GAACAATTCTGAGAACATAGGCAAAAAT



我用bioperl写过程序,把这个大文件读入就需要一个小时,要处理的数组和文件都多,这样耗费时间不大现实。
求教快速的方法,非常感谢




论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2012-07-27 08:56 |只看该作者
回复 1# feiyue0908


    边读文件边截取的思路 应该可以完成你的要求

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2012-07-27 09:03 |只看该作者
你内存多少,按你说的数据也就多一百多M怎么会读一个小时。

另外你这个可以按流的方式处理,一次读入一条数据截取然后就可以丢掉了

论坛徽章:
0
4 [报告]
发表于 2012-07-27 09:15 |只看该作者
回复 3# zhlong8


    上面的例子肯定很快就运行完,但完整的文件有1亿多个字母,用bioperl读入这个fasta文件就需要很长时间的。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
5 [报告]
发表于 2012-07-27 09:16 |只看该作者
seek(fd, 2, 0);
read 8-2+1 bytes
seek(fd, 12, 0);
read 16-12+1 bytes;

其他依次类推,应该很快

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2012-07-27 09:22 |只看该作者
feiyue0908 发表于 2012-07-27 09:15
回复 3# zhlong8

看来bioperl 做了很多额外的工作,但是这里明显影响性能了要么你就查文档这数据量应该在处理范围,要么就自己动手

论坛徽章:
0
7 [报告]
发表于 2012-07-27 11:50 |只看该作者
写了一个,你试试
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @allcdss=(2,8,12,16,18,25,28,35,80,90,102,110,120,125);
  5. my @allcuts;
  6. {
  7.     local $/ = \100;
  8.     my ($min,$max) = (0,0);
  9.     my $left = '';
  10.     while (defined (my $line = <DATA>)) {
  11.         $line =~ s/\n//g;
  12.         $min  = $max - length($left);
  13.         $max  = $max + length($line);
  14.         $line = $left . $line;
  15.         
  16.         print "$min $max \n";
  17.         my @allcdss_tmp  = grep { $_ > $min && $_ <= $max } @allcdss;
  18.         if (@allcdss_tmp) {
  19.             my $template = cut2fmt($min,@allcdss_tmp);
  20.             print $template,"\n";
  21.             my @fields   = unpack($template,$line);
  22.             if ($allcdss_tmp[-1] != $max) {
  23.                 $left = pop @fields;
  24.             }
  25.             push @allcuts,@fields;
  26.         } else {
  27.             $left = $line;
  28.             next;
  29.         }
  30.         
  31.         last if $allcdss_tmp[-1] == $allcdss[-1];
  32.     }
  33. }
  34. print "@allcuts\n";

  35. sub cut2fmt {
  36.     my $minpos = shift;
  37.     my(@positions) = @_;
  38.     print "@positions\n";
  39.     my $template   = ($positions[0] != $minpos) ? 'x' . ($positions[0] - $minpos - 1) : '';
  40.     my $cut_string = 1;
  41.    
  42.     my $lastpos = shift @positions;
  43.     foreach my $place (@positions) {
  44.         if ($cut_string % 2 == 1) {
  45.             my $dist   = $place - $lastpos;
  46.             $template .= ($dist > 0) ? 'A' . ($dist + 1) : '';
  47.         } else {
  48.             my $dist   = $place - $lastpos;
  49.             $template .= ($dist > 0) ? 'x' . ($dist - 1) : '';
  50.         }
  51.         $lastpos = $place;
  52.         $cut_string++;
  53.     }
  54.       
  55.     $template  .= 'A*';
  56.     return $template;
  57. }

  58. __DATA__
  59. AGAACAATATCTCTGATGAACATAGATGCAAAAATCCTCAACAACATACTAGCTAAATAATCCAACAACT
  60. CATCAAAAGGATAATACACCATGATCAAGTGGGTTCATCCTAGAGATGCAGGGATGGTTTAACACATGCA
  61. AGTCAATAAATATGATACATCACATAAACGGAATTAAAACAAAAACCACATGATCATCTCAATAGATGCA
  62. GGAAAAGCATTTGATAAAATCTAGCAGCCCTTTATGATAAAACCCCTCAAGAAACTAGGTAAAGAAGGGG
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP