免费注册 查看新帖 |

Chinaunix

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

求助!perl抓取匹配行的下一行字符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-28 11:44 |只看该作者 |倒序浏览
各位大牛们,小弟会一点入门级perl语言,有一个问题想请教大家:
我想知道,perl对变量的模式匹配是如何操作的,例如,我有一个文件,里面数据的格式如下
javascript:;
数据名称为>后面的那些字符,我有一个文件,全是数据名称,我想提取出那些匹配的数据名称下面的字符(ttacg之类的),自己弄了个难看的脚本如下
#!/usr/bin/perl

if (@ARGV < 2)
               {
               die "usage: outputseq See script for details.\n";
               }
open(LOCI, "$ARGV[0]") || die "usage: outputseq location file \nCan not open the seq_file $ARGV[0].\nSee script for details.\n";
open(DNASEQ, "$ARGV[1]") || die "usage: genome seq file \nCan not open the seq_file $ARGV[1].\nSee script for details.\n";            

while($seq=<LOCI>)
{   @seq=split(/\s+/,$seq);
   $name=$seq[1];
for($info=<DNASEQ>)
   {  
   if($info=~/$name/)
      {
    print "$info";
    $info=<DNASEQ>;
    print $info;
    last;
      }
   }
}
close LOCI;
close DNASEQ;
结果总是弄不出来,不得已请教各位,希望大家能帮我看看,非常感谢!

1.png (41.34 KB, 下载次数: 32)

1.png

论坛徽章:
0
2 [报告]
发表于 2010-08-28 14:42 |只看该作者
你可以先建一个哈希,将所有的数据名称作为key。然后再打开另一个文件,一行一行读,如果存在这个key,就打印出来。这样就得到你想要的数据了。

论坛徽章:
0
3 [报告]
发表于 2010-08-28 15:02 |只看该作者
非常感谢!
思路我清楚了,我对hash还不够了解,感觉不知道如何实现,能给点提示吗?举个例子可以吗?
谢谢!

论坛徽章:
0
4 [报告]
发表于 2010-08-28 15:37 |只看该作者
非常感谢!
思路我清楚了,我对hash还不够了解,感觉不知道如何实现,能给点提示吗?举个例子可以吗?
谢 ...
xp198766 发表于 2010-08-28 15:02



    看小骆驼·

论坛徽章:
0
5 [报告]
发表于 2010-08-28 15:44 |只看该作者
看小骆驼·
wfnh 发表于 2010-08-28 15:37



    {:2_170:}恩,一定会看的,就是现在有个小问题,想请教各位…能给个例子吗?非常感谢!

论坛徽章:
0
6 [报告]
发表于 2010-08-28 18:35 |只看该作者
本帖最后由 iamxesam 于 2010-08-28 18:48 编辑

你是这个意思吧?
  1. #!/usr/bin/perl

  2. if (@ARGV < 2){
  3.         die "usage: outputseq See script for details.\n";
  4. }
  5. open(LOCI, "$ARGV[0]") || die ;
  6. open(DNASEQ, "$ARGV[1]") || die ;            

  7. my %hash_name;
  8. $/=">";
  9. <LOCI>
  10. while(<LOCI>){   
  11.         my ($head,$seq)=split(/\n/,$_);
  12.         $hash_name{$head}=$seq;
  13. }
  14. $/="\n";
  15. while(<DNASEQ>){  
  16.         print $hash_name{$_},"\n";
  17. }
  18. close LOCI;
  19. close DNASEQ;
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-08-28 19:47 |只看该作者
回复 6# iamxesam


    您好!非常感谢你的回答,我运行之后,总提示
syntax error at net line 12, near "){"
syntax error at net line 15, near "}"
Execution of net aborted due to compilation errors.

我文件的规律是
>名称
actg……  #序列

有还有一个文件,第二列是  名称  信息,可以split,把名称找出来,我想通过找出来的名称,到上一个文件中把相应序列打印出来,将您的代码改动了一下之后,发现总是提示上面的出错,不知道问题出在哪里?我生物出身,当时大学就没怎么用心学编程,现在在网上找相关信息,理解上面有点困难,不好意思,再次感谢您的回答!

论坛徽章:
0
8 [报告]
发表于 2010-08-28 20:16 |只看该作者
本帖最后由 iamxesam 于 2010-08-28 20:17 编辑
  1.   #!/usr/bin/perl

  2. if (@ARGV < 2){
  3.         die "usage: outputseq See script for details.\n";
  4. }
  5. open(LOCI, "$ARGV[0]") || die ;
  6. open(DNASEQ, "$ARGV[1]") || die ;            

  7. my %hash_name;
  8. $/=">";
  9. <LOCI>;
  10. while(<LOCI>){   
  11.         my ($head,$seq)=split(/\n/,$_);
  12.         $hash_name{$head}=$seq;
  13. }
  14. $/="\n";
  15. while(<DNASEQ>){  
  16.         my $head=(split(/\s+/,$_))[1];
  17.         print “$hash_name{$head}\n" if defined $hash_name{$head};
  18. }
  19. close LOCI;
  20. close DNASEQ;
复制代码
错误时因为<LOCI>后面掉了一个分号;
第一个文件:
>chromosome01
atcgatcgatcgatcgatcgatcgatcgatcgatcgatcgatcgatcg


第二个文件:
001  chromosome01
002  chromosome02
003  chromosome03

论坛徽章:
0
9 [报告]
发表于 2010-08-28 20:34 |只看该作者
回复 8# iamxesam


    非常感谢您的帮助!我已经解决问题了!非常谢谢!
我还有一点不明白

$/=">";
<LOCI>;

这是什么意思啊?
还有后面的

$/="\n";

谢谢!

论坛徽章:
0
10 [报告]
发表于 2010-08-28 20:42 |只看该作者
$/是代表的换行标识
<LOCI>先读取第一个”>"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP