免费注册 查看新帖 |

Chinaunix

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

求助 perl [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-13 10:05 |只看该作者 |倒序浏览
下面格式内容,把中间的大写字母的配对率测出来,
根据中间配对率大小:把小于0.6的存入文件1.txt,0.6-0.9之间的存入文件2.txt,大于0.9的存入3.txt文件

I001        195        TTGGT        205        225
E012        148        TTCGT        158        200

I001        1124        TTTCTT        1151        2978
E012        4        TAATGT        31        128

I002        17        AATTGACT        29        54
E023        5        AATTGACT        17        128

I003        16        TCGACTTAAT        35        65
E034        44        TGGACATAAT        63        200

配对率定义:设最佳匹配长度为m bp,若有k个碱基完全配对,则配对率为k/m。例如第一组序列配对率为:4/5=0.8,第二组为:2/6=0.3。。。
结果如下:
1.txt中有
I001        1124        TTTCTT        1151        2978
E012        4        TAATGT        31        128
2.txt中有:
I001        195        TTGGT        205        225
E012        148        TTCGT        158        200
I003        16        TCGACTTAAT        35        65
E034        44        TGGACATAAT        63        200
3.txt中有:
I002        17        AATTGACT        29        54
E023        5        AATTGACT        17        128


论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-03-13 10:54 |只看该作者
本帖最后由 rubyish 于 2013-03-13 06:58 编辑

如下:
  1. #!/usr/bin/perl
  2. my @f = map { open my ($f), '>', $_; $f } qw/1.txt 2.txt 3.txt/;
  3. while (<DATA>) {
  4.     next if /^\s*$/;
  5.     my $S2 = <DATA>;
  6.     my $s1  = (split)[2];
  7.     my ($s2) = $S2 =~ /([ATGC]+)/;
  8.     my ( $l, $m ) = length $s1;
  9.     for my $i ( 0 .. $l - 1 ) {
  10.         substr( $s1, $i, 1 ) eq substr( $s2, $i, 1 ) && $m++;
  11.     }
  12.     my $p = $m / $l;
  13.     my $i = $p < 0.6 ? 0 : $p < 0.9 ? 1 : 2;
  14.     print { $f[$i] } $_, $S2;
  15. }

  16. __DATA__
  17. I001        195        TTGGT        205        225
  18. E012        148        TTCGT        158        200

  19. I001        1124        TTTCTT        1151        2978
  20. E012        4        TAATGT        31        128

  21. I002        17        AATTGACT        29        54
  22. E023        5        AATTGACT        17        128

  23. I003        16        TCGACTTAAT        35        65
  24. E034        44        TGGACATAAT        63        200
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-03-13 11:54 |只看该作者
大侠再:wink: 帮我看看,怎么产生随机序列?
下面格式内容,把中间的大写字母的GC含量测出来,
根据中间GC含量大小:把I001,I002,。。。。等开头的序列换成随机序列(此序列要和原序列GC含量和长度一样),E012....等E开头的序列不变。
16191_NC_003284
I001CACTCA
E012ATGACAAGGAAGCGGCG

16192_NC_003284
I001CACAAGA
E012TCTACAACACGTCTGCTC
I002CATG
E023GCTGCAGAGA
GC含量定义:设序列长度为m bp,若序列有k个G+C(就是C和G的总是),则GC含量为k/m。
例如I001序列GC含量为:3/6=0.5,第二个I001序列为:3/7=0.43,第三序列为0.25,I002序列为0.5。
结果如下:
16191_NC_003284
I001AGCTTC
E012ATGACAAGGAAGCGGCG

16192_NC_003284
I001GATCAGT
E012TCTACAACACGTCTGCTC
I002TGGA
E023GCTGCAGAGA

回复 2# rubyish


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2013-03-13 13:40 |只看该作者
看看:
  1. #!/usr/bin/perl
  2. my @G = qw/G C/;
  3. my @A = qw/A T/;

  4. print /^I/ ? Rand() : $_ while <DATA>;

  5. sub Rand {
  6.     my ( $h, $t ) = /^(.*\d+)(.*)$/;
  7.     my @t = map /[GC]/ ? $G[rand 2] : $A[rand 2], $t =~ /./g;
  8.     @t = map splice(@t, rand @t, 1), 0 .. $#t;
  9.     join '', $h, @t, $/;
  10. }

  11. __DATA__
  12. 16191_NC_003284
  13. I001CACTCA
  14. E012ATGACAAGGAAGCGGCG

  15. 16192_NC_003284
  16. I001CACAAGA
  17. E012TCTACAACACGTCTGCTC
  18. I002CATG
  19. E023GCTGCAGAGA
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-03-13 14:00 |只看该作者
新手来试试
#!/usr/bin/perl
$src='e:\perl\src1.txt';
open OPF ,$src or die "cant open ";
$opkey=0;
while (<OPF>){
if(/^$/) {next};
if ($opkey==0){
        $first=$_;
        chomp $_;
        /(\w\d+)\ +(\d+)\ +(\w+)\ +(\d+)\ +(\d+)/;
        $a=$3;
        $opkey++;
        }
elsif ($opkey==1){
        $second=$_;
        chomp $_;
        /(\w\d+)\ +(\d+)\ +(\w+)\ +(\d+)\ +(\d+)/;
        $b=$3;
        $leng=length $b;
        @aa=(split //,$a);
        @bb=(split //,$b);

        for ($i=0;$i<$leng;$i++){
                $sfta=shift @aa;
                $sftb=shift @bb;
                if ($sfta eq $sftb){$sum +=1;}
                }
         $percent=$sum/$leng;
         if($percent <=0.6){
                                open GO,">>","d:\\proj1\\1.txt";
                                print GO $first;
                                print GO $second;
                                 }
         if(($percent<=0.9)&&($percent>=0.6)){
                                 open GO,">>","d:\\proj1\\2.txt";
                                        print GO $first;
                                print GO $second;
                                }
         if($percent >=0.9){
                                 open GO,">>","d:\\proj1\\3.txt";
                                 print GO $first;
                                print GO $second;
                                }
         $opkey=0;
        }
$sum=0;
}

论坛徽章:
0
6 [报告]
发表于 2013-03-13 15:44 |只看该作者
谢谢你,写的很详细。。回复 5# zzwevil


   

论坛徽章:
0
7 [报告]
发表于 2013-03-13 15:49 |只看该作者
这么简练的代码就搞定了,就是要懂很费劲呀。
非常感谢你,帮我大忙了。。。回复 4# rubyish


   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
8 [报告]
发表于 2013-03-13 18:50 |只看该作者
  1. #!/usr/bin/perl
  2. my (%hash,@dna,$text);
  3. my $data = do {local $/;<DATA>};
  4. my @line = split/^\s+/m,$data;
  5. for (@line){
  6. if(/([ATGC]+)[\s\S]+?([ATGC]+)/){
  7.     my ($len,$count) = length $2;
  8.    my @arr = split//,$2;
  9.    for (split//,$1){
  10.      $count++ if($_ eq shift(@arr));
  11. }
  12.     my $m=$count/$len;
  13.     my $text = $m<0.6?1:$m<0.9?2:3;
  14.    open FH,">>$text.txt" or die "$!";
  15.     print FH $_;
  16.    close FH;
  17. }
  18.     }
  19. __DATA__
  20. I001        195        TTGGT        205        225
  21. E012        148        TTCGT        158        200

  22. I001        1124        TTTCTT        1151        2978
  23. E012        4        TAATGT        31        128

  24. I002        17        AATTGACT        29        54
  25. E023        5         AATTGACT        17        128

  26. I003        16        TCGACTTAAT        35        65
  27. E034        44        TGGACATAAT        63        200
复制代码
回复 1# zhagnqiang829


   
sinian126 该用户已被删除
9 [报告]
发表于 2013-03-14 19:04 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
10 [报告]
发表于 2013-03-14 21:13 |只看该作者
回复 9# sinian126


    所有字符串包括换行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP