免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl 求助
12下一页
最近访问板块 发新帖
查看: 4157 | 回复: 11
打印 上一主题 下一主题

求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-01 09:38 |只看该作者 |倒序浏览
序列格式为:  
rps-3
I001CATTTTAATAATTAGTTTTTATATCGTA
E001ACAACTTCCTGATGAAGGAGCTTGC
I001        30        ATTCGA        40        49
E001        44        AGTCGA        54        100
11                37
I002CATACTAATGAAATAAAATTATC
E002GCTACGGAGTTCTCCGTTTCATCATGGAGTCT
I002        1        CATACTAATA        18        98
E002        81        CGTGCTAAGA        100        100
20                37
rps-1
I001CATTGCAAAATAAAACAAAATATTAAG
E001GCAAGGAATGGTACGACATCAAG
I001        6        CAAAAT        29        82
E001        68        CAACAG        91        100
24                48
rps-4
I001CATTAATATTAAACATAAGAAAGATCAAAAC
E012CGTCGACGGAAAGGTCAGAACCTGCCATTCCG
I001        19        GCCCGATCTT        33        86
E012        9        GCCCGGTCAT        23        100
15                48
I002CATTCAAACGGATTTTCCGATTTCCT
E034TCTGACATCATCCACATCAAGGATTCTG
I002        67        ATTCCAAC        82        120
E034        10        ATCCACAT        25        100
16                35
要求:I00*开头的红色的那行序列满足3个条件:如果最后一个数字大于80且小于100;倒数第二个数大于20;
GC含量小于0.3(G和C出现的个数之和除以序列长度,如第一个红色序列,C和G总数为2,长度为6,所以2/6=0.33),
则输出符合条件的I00*开头绿色哪行序列。
结果为:
rps-1
I001CATTGCAAAATAAAACAAAATATTAAG

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-01-01 15:40 |只看该作者
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use 5.010;

  5. my @data = <DATA>;

  6. while (@data) {
  7.         our $title = shift @data if $data[0] =~ /r/;
  8.         my @sub = splice @data, 0, 5;
  9.         my @array = split /\s+/, $sub[2];
  10.         if ( $array[-1] > 80 && $array[-1] < 100 && $array[-2] > 20 ) {
  11.                 my $times;
  12.                 $times++ while $array[2] =~ /G|C/g;
  13.                 print $title, $sub[0] if $times / length($array[2]) < 0.3;
  14.         }
  15. }

  16. __DATA__
  17. rps-3
  18. I001CATTTTAATAATTAGTTTTTATATCGTA
  19. E001ACAACTTCCTGATGAAGGAGCTTGC
  20. I001        30        ATTCGA        40        49
  21. E001        44        AGTCGA        54        100
  22. 11                37
  23. I002CATACTAATGAAATAAAATTATC
  24. E002GCTACGGAGTTCTCCGTTTCATCATGGAGTCT
  25. I002        1        CATACTAATA        18        98
  26. E002        81        CGTGCTAAGA        100        100
  27. 20                37
  28. rps-1
  29. I001CATTGCAAAATAAAACAAAATATTAAG
  30. E001GCAAGGAATGGTACGACATCAAG
  31. I001        6        CAAAAT        29        82
  32. E001        68        CAACAG        91        100
  33. 24                48
  34. rps-4
  35. I001CATTAATATTAAACATAAGAAAGATCAAAAC
  36. E012CGTCGACGGAAAGGTCAGAACCTGCCATTCCG
  37. I001        19        GCCCGATCTT        33        86
  38. E012        9        GCCCGGTCAT        23        100
  39. 15                48
  40. I002CATTCAAACGGATTTTCCGATTTCCT
  41. E034TCTGACATCATCCACATCAAGGATTCTG
  42. I002        67        ATTCCAAC        82        120
  43. E034        10        ATCCACAT        25        100
  44. 16                35
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-01-01 17:11 |只看该作者
谢谢你的热心帮助,结果运行正确。
但运行大的文件时,还些小问题,主要是格式问题。所以我只把红色和绿色行的序列提出来,保持格式一致性(已处理)。
如果原文件里只有红色的和绿色的俩行,还是原问题的要求,该怎么修改代码。

序列格式为:
I001CATTTTAATAATTAGTTTTTATATCGTA
I001        30        ATTCGA        40        49
I002CATACTAATGAAATAAAATTATC
I002        1        CATACTAATA        18        98
I001CATTGCAAAATAAAACAAAATATTAAG
I001        6        CAAAAT        29        82
I001CATTAATATTAAACATAAGAAAGATCAAAAC
I001        19        GCCCGATCTT        33        86
I002CATTCAAACGGATTTTCCGATTTCCT
I002        67        ATTCCAAC        82        120

结果为:
I001CATTGCAAAATAAAACAAAATATTAAG
回复 2# yestreenstars


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
4 [报告]
发表于 2014-01-01 17:54 |只看该作者
回复 3# zhagnqiang829
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use 5.010;

  5. while (<DATA>) {
  6.         my @array = split /\s+/, <DATA>;
  7.         if ( $array[-1] > 80 && $array[-1] < 100 && $array[-2] > 20 ) {
  8.                 my $times;
  9.                 $times++ while $array[2] =~ /G|C/g;
  10.                 print if $times / length($array[2]) < 0.3;
  11.         }
  12. }

  13. __DATA__
  14. I001CATTTTAATAATTAGTTTTTATATCGTA
  15. I001        30        ATTCGA        40        49
  16. I002CATACTAATGAAATAAAATTATC
  17. I002        1        CATACTAATA        18        98
  18. I001CATTGCAAAATAAAACAAAATATTAAG
  19. I001        6        CAAAAT        29        82
  20. I001CATTAATATTAAACATAAGAAAGATCAAAAC
  21. I001        19        GCCCGATCTT        33        86
  22. I002CATTCAAACGGATTTTCCGATTTCCT
  23. I002        67        ATTCCAAC        82        120
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2014-01-01 18:21 |只看该作者
{:2_172:} 小伙伴们, 这个简约时尚国际范。
  1. #!/usr/bin/perl -w

  2. while (<DATA>) {
  3.     my ( $s, $n1, $n2 ) = ( split /\s+/, <DATA> )[ 2, 3, 4 ];
  4.     next if $n1 < 20 or $n2 < 80 or $n2 > 100;
  5.     print if map( /[GC]/g, $s ) / length $s < 0.3;
  6. }

  7. __DATA__
  8. I001CATTTTAATAATTAGTTTTTATATCGTA
  9. I001        30        ATTCGA        40        49
  10. I002CATACTAATGAAATAAAATTATC
  11. I002        1        CATACTAATA        18        98
  12. I001CATTGCAAAATAAAACAAAATATTAAG
  13. I001        6        CAAAAT        29        82
  14. I001CATTAATATTAAACATAAGAAAGATCAAAAC
  15. I001        19        GCCCGATCTT        33        86
  16. I002CATTCAAACGGATTTTCCGATTTCCT
  17. I002        67        ATTCCAAC        82        120
复制代码
回复 3# zhagnqiang829


   

论坛徽章:
0
6 [报告]
发表于 2014-01-01 18:48 |只看该作者
谢谢给位大神!!!!

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
7 [报告]
发表于 2014-01-03 09:07 |只看该作者
学习了~~ ·· 回复 5# pitonas


   

论坛徽章:
0
8 [报告]
发表于 2014-01-04 22:59 |只看该作者
针对原问题的code,比较拙劣:my %h;
$/="rps-";
while (<DATA>) {
        my ($key) = /^(\d+)\n/;
        $key = "rps-"."$key";
        my (@k) = /(I\d+\w+)\n/g;
        my (@v) = /(I\d+\s+.*)\n/g;
        for my $i(0..$#k) {
                        $h{$key}{$k[$i]}=$v[$i];
                        my @str = split /\s+/,$v[$i];
                        if ($str[3]>20 and $str[4]<100 and $str[4]>80){
                        my $count = $str[2] =~ tr/GC/GC/;
                        print "$key\n$k[$i]\n" if $count/length($str[2])<0.3
                        }
        }
}

论坛徽章:
0
9 [报告]
发表于 2014-01-05 08:25 来自手机 |只看该作者
our  shift   splice  的组合亮瞎了我的双眼。赞!

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
10 [报告]
发表于 2014-01-05 18:01 |只看该作者
{:2_168:} 看得我都激动了...

回复 9# jzp520520


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP