免费注册 查看新帖 |

Chinaunix

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

求序列重复的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-13 16:08 |只看该作者 |倒序浏览
大家好:
  我有一些字母组成的序列。我想让它们每60个连续字母为一组,而且上一组的最后25个连续字母 和 下一组的前面25个连续的字母应该是重复的。以此类推。 这程序现在没一点思路。是不是应该建一个子程序?
    望大家给予帮助。
例子是这样的:
qwertyyuuiiooasdfghjklzxcvbnmqweeaqwdrfgthyjuikmnbvcxzsaaqwertgfdsssyuimnbvcxzaswqerttyyuuuijmnbvcx

我要的结果是这样的:
qwertyyuuiiooasdfghjklzxcvbnmqweeaqwdrfgthyjuikmnbvcxzsaaq  #比如说这是60个,那么第二组是:
aqwdrfgthyjuikmnbvcxzsaaqwertgfdsssyuimnbvcxzaswqerttyyuuu #加粗的连续字母就是重复的。这样以此类推。

论坛徽章:
0
2 [报告]
发表于 2010-03-13 16:55 |只看该作者
本帖最后由 longbow0 于 2010-03-13 17:25 编辑

是不是想把一个长的序列,如基因组,分成 60 bp 的片段,相邻 2 段的首尾 25 字符 一样?


  1. my $seq = 'qwertyyuuiioo...';
  2. my $offset = 0;
  3. my $len = 60;

  4. my $i = 0;

  5. while ( $i < ( length($seq)/35) ) {
  6.     my $subseq = substr($seq, $offset, $len);

  7.     (do sth.)
  8.    
  9.     $offset +=35;
  10.     $i++;
  11. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-03-13 17:08 |只看该作者
对的。您很厉害。我刚接触生物这块。呵呵。这里要用到关于很多perl 的东西。
这是我刚才写的。写到这里真是没思路了。呵呵

use strict;
use warnings;
open(FH,'D:\sequences.fasta') || die "$!";
my $n = 0;
my $length = 60;
my $i = 0;

while (<FH>) {
    my $value = substr ($_,$n,60);
    last if (length $value < 35);
    print "$value\n";
}

您的方法还是好。我仔细研究一下。谢谢您了

论坛徽章:
0
4 [报告]
发表于 2010-03-13 17:08 |只看该作者
回复 2# longbow0


    的确不错。不过这个length($seq)/35 + 1这个+1似乎是多余的。

  1. use strict;
  2. use Data::Dumper;

  3. my $seq = "qwertyyuuiiooasdfghjklzxcvbnmqweeaqwdrfgthyjuikmnbvcxzsaaqwertgfdsssyuimnbvcxzaswqerttyyuuuijmnbvcx";

  4. my $offset = 0;
  5. my $len = 60;

  6. my $i = 0;
  7. my @result;

  8. while ( $i < ( length($seq)/35) ) {
  9.     my $subseq = substr($seq, $offset, $len);
  10.     push @result,$subseq;

  11.     $offset +=35;
  12.     $i++;
  13. }

  14. print Dumper \@result;
复制代码



output:

$VAR1 = [
          'qwertyyuuiiooasdfghjklzxcvbnmqweeaqwdrfgthyjuikmnbvcxzsaaqwe',
          'wdrfgthyjuikmnbvcxzsaaqwertgfdsssyuimnbvcxzaswqerttyyuuuijmn',
          'imnbvcxzaswqerttyyuuuijmnbvcx'
        ];

论坛徽章:
0
5 [报告]
发表于 2010-03-13 17:21 |只看该作者
回复  longbow0


    的确不错。不过这个length($seq)/35 + 1这个+1似乎是多余的。




output:
...
兰花仙子 发表于 2010-03-13 17:08



   谢谢 仙子 提醒,确实是考虑不周。

论坛徽章:
0
6 [报告]
发表于 2010-03-14 03:54 |只看该作者
本帖最后由 leigh111 于 2010-03-14 03:55 编辑

还得求大家一个忙,就是读入一个文件的话。
比如说文件里是:
fgheiojwdcasdncjnksacnsadahhawkdnjkaskjdhukwhuiadckjsncmnawkaw
twgdhjdvsbcmabwhdjbcmnsb hfgvjagwgdrfhjfmasvdghafywgdvsvcdhvhj
wadjwbjdbahvwdyawvbhjdvhwjagdyagdhjvqawyfdyqvvghsfdyasfyudgw
awdawdcadawdcdffehfuiehwhbefehfuewj

因为while是一行一行读取的。当open这个文件时,我想让它们组成一个字符串,就是第一行和第二行没有换行符的。依此类推。
像这样:
my $seq = "fgheiojwdcasdncjnksacnsadahhawkdnjkaskjdhukwhuiadckjsncmnawkawfgheiojwdcasdncjnksacnsadahhawkdnjkaskjdhukwhuiadckjsncmnawkawwadjwbjdbahvwdyawvbhjdvhwjagdyagdhjvqawyfdyqvvghsfdyasfyudgwawdawdcadawdcdffehfuiehwhbefehfuewj";
就是去掉每一行最后的换行符。该怎么实现呢?
我用 chop函数不行。用join 函数也没实现成功。

论坛徽章:
0
7 [报告]
发表于 2010-03-14 04:47 |只看该作者
处理序列文件的时候,像 GenBank、Fasta 等,最好是用 BioPerl 读写,可以避免在输入输出格式上的麻烦。

  1. #
  2. # 从 Fasta 文件中读取序列
  3. #
  4. use Bio::SeqIO;

  5. my $o_seqi = Bio::SeqIO->new(
  6.     -file => 'seq.fasta',
  7.     -format => 'fasta',
  8. );

  9. while (my $o_seq = $o_seqi->next_seq) {
  10.     my $seq = $o_seq->seq;    # 这里 $seq 就是你所需要的除去了换行、空白等等的序列字符串
  11.     ...
  12. }
复制代码
BioPerl - http://www.bioperl.org/

CPAN
Bio::SeqIO - http://search.cpan.org/~cjfields/BioPerl-1.6.1/Bio/SeqIO.pm
Bio::Seq - http://search.cpan.org/~cjfields/BioPerl-1.6.1/Bio/Seq.pm

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
8 [报告]
发表于 2010-03-14 14:16 |只看该作者
还得求大家一个忙,就是读入一个文件的话。
比如说文件里是:
fgheiojwdcasdncjnksacnsadahhawkdnjkaskjd ...
leigh111 发表于 2010-03-14 03:54



    用chomp()可以去除换行,然后join

论坛徽章:
0
9 [报告]
发表于 2010-03-15 08:39 |只看该作者
对的。搞个半天。其实是自己 忽略一个小点
open(FH,'D:\sequences.fasta') || die "$!";
my $string;
while (<FH>) {
    chomp;
  $string .= $_;   #这一步就搞定了。呵呵。我说怎么chomp不行呢。

谢谢大家的帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP