免费注册 查看新帖 |

Chinaunix

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

根据文件1中的某些字符串模式在另一个文件中遍历查找该模式出现次数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-25 21:32 |只看该作者 |倒序浏览
本帖最后由 lijie_perl 于 2011-12-25 21:36 编辑

一、今天圣诞节,过几天新的一年也将来到了,祝所有常逛CU的朋友们节日快乐,同时祝CU越办越好,越来越强大。注册CU论坛2个月以来,在这里学了不少东西,受到很多人的帮助~~非常感谢你们~
尤其是iamlimeng, yinyuemi,zhlong8 ,xfoucs ,afukada,dgtnk ,askzhigang ,x9x9(BinColder),beginninger ,PfanAya ,justlooks ,jason680,........等等perl前辈和高手。

二、一个问题问大家,圣诞节叨扰,不好意思~~~

有一文件(som_file.txt)
  1. H2AK5ac  H2BK120ac    H3K14ac H3K18ac   H3K36ac H3K4ac    H4K5ac H4K8ac                              8
  2.      H2BK5ac  H3K18ac   H3K36ac H3K4ac    H4K5ac                               5
  3.       H3K14ac    H3K36ac H3K4ac    H4K5ac H4K8ac                              5
  4.      H2BK5ac H3K14ac    H3K36ac    H4K16ac  H4K8ac              H3K79me3                5
  5.       H3K14ac    H3K36ac      H4K8ac H4K91ac  H2BK5me1                           4
  6. ..........(全部见附件)
复制代码
一共5515行,每一行代表一种分类。比如第3行代表H3K14ac,H3K36ac,H3K4ac,H4K5ac和H4K8ac 聚为一类,最后一列的数字代表这种分类出现的次数。

上面的结果是计算机统计相关生物信息数据得出的。
现在我想根据生物实验得出的某一模式去文件som_file.txt中查找该模式是否出现了,如果出现,不管出现几次,就输出"1";若没有,输出“0”.
例如若实验模式是:H4K5ac,H3K36ac,H3K14ac ,则在上面文件中查找, 发现出现了2次(第一行和第三行),这样我结果就输出"1"(证明该模式在文件som_file.txt出现了)。
  1. #!/bin/perl -w
  2. use strict;
  3. open (INFILE, "som_file.txt");

  4. while( <INFILE> ){
  5.         if (m#H4K5ac# && m#H3K36ac# && m#H3K14ac# ){
  6.                 print "1"."\n";
  7.                 last; #只要找到匹配就输出1并退出此次循环
  8.         }
  9. }   
  10. close(INFILE);
复制代码
上述代码一个一个的查找是没有问题的。但是,
现在我有生物实验数据(table.txt)
  1. H3K14ac,H3K18ac,H3K23ac,H3K27ac,H3K36me1,H3K9me3
  2. H3K14ac,H3K18ac,H3K23ac,H3K27ac,H3K36me2,H3K4me1,H3K9ac
  3. H3K14ac,H3K18ac,H3K23ac,H3K27ac,H3K36me2,H3K4me2,H3K9ac
  4. H3K14ac,H3K18ac,H3K23ac,H3K27ac,H3K36me2,H3K4me3,H3K9me2
  5. ..........
复制代码
一共有365行,代表有365个试验证明的模式。(该文件被我稍改变了一下形式存为文件find.txt,目的是为了模式查找)

现在我希望对每一个实验模式,都去遍历文件som_file.txt,看该实验模式是否在文件som_file.txt中出现了。如果出现,不管出现几次,输出"1";若没有,输出“0”.
  1. #!/bin/perl -w
  2. use strict;
  3. my @arry;
  4. my $n=0;

  5. open (INFILE, "som_file.txt");
  6. while( <INFILE> ){
  7.         push @arry ,$_;
  8. }
  9. close(INFILE);

  10. open (IN,"find.txt");
  11. open (OUT,">result_find.txt");
  12. while(my $tep= <IN> ){
  13.         foreach my $arry (@arry){
  14.                 if ($tep){   #我认为就是if语句有问题,但是不知道怎样将匹配模式传给程序。
  15.                         #只要找到匹配就输出1并退出此次循环,进入下一模式查找。
  16.                         print OUT "1"."\n";
  17.                         $n++; #统计共匹配了多少次。
  18.                         last;
  19.                 }else{
  20.                         print OUT "0"."\n";
  21.                         last;
  22.                 }
  23.         }   
  24. }
  25. print $n;
  26. close(IN);
  27. close(OUT);
复制代码
程序输出365个"1",这是不可能的,因为有些实验模式在文件som_file.txt是没有匹配的,最后结果应该为365个既有"0"又有"1"的输出。
我上CU查找了一下相关遍历查找的帖子,但是自己水平有限,一直没有得到想要的结果,请大家帮我改改~~~~~

呵呵,谢谢~
----------------------圣诞快乐!----------------------------



data.rar

38.33 KB, 下载次数: 47

论坛徽章:
0
2 [报告]
发表于 2011-12-26 05:02 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.12.3;

  5. open(FH,"data/som_file.txt") || die "can't open the file";
  6. my %uniq;
  7. while(my $line=<FH>){
  8.         chomp($line);
  9.         unless($line=~/^【\s\d]+$/){
  10.                 my @unit=split /\s+/,$line;
  11.                 foreach my $element (@unit) {
  12.                         $uniq{$element}=1;
  13.                 }
  14.         }
  15. }

  16. close(FH) || die "can't close the file";

  17. foreach my $output (keys %uniq) {
  18.         unless($output=~/^[\d.]+$/){
  19.                 say "$output";
  20.         }
  21. }
复制代码
alexrudemacbookairownloads alexru$ perl an.pl |uniq|wc -l
      40
不太明白你的意思,测试了一下也只有40个模式吧?

论坛徽章:
0
3 [报告]
发表于 2011-12-26 05:04 |只看该作者

H2BK5me1
H3K79me1
H3K4me1
H3K9me1
H2BK5ac
H3K18ac
H3K27me3
H3K27me1
H4K20me1
H3K36me3
H3K9me2
H2BK12ac
H4K91ac
H2AK9ac
H3K9me3
H3K79me3
H3K27me2
H4K16ac
H4K8ac
H3K36me1
H3K36ac
H4K12ac
H3K4me3
H3R2me1
H2BK20ac
H2AK5ac
H3K4me2
H2BK120ac
H3K14ac
H3K9ac
H4R3me2
H3K79me2
H4K5ac
H3K27ac
H3K23ac
H4K20me3
H3R2me2
H2AZ
H3K4ac

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2011-12-26 07:02 |只看该作者
  1. #!/bin/perl

  2. use strict;

  3. my @data1;
  4. open (F1,"som_file.txt");
  5. @data1=(<F1>);
  6. close(F1);

  7. open(F2,"table.txt");
  8. open(OUT,"results.txt");
  9. while(<F2>){
  10.         chomp;
  11.         my @arr=split /,/;
  12.         my $label=0;
  13.         foreach my $item (@data1){
  14.                 my $n=0;
  15.                 map{if($item=~$_){$n++}}@arr;
  16.                 if($n==$#arr+1){$label=1;last;}
  17.         }
  18.         print join ",", @arr," $label\n";
  19. }

  20. close(F2);
  21. close(OUT);
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-12-26 10:33 |只看该作者
谢谢~
是我程序问题~~学习了!!!

论坛徽章:
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
6 [报告]
发表于 2011-12-26 10:56 |只看该作者
  1. #!/usr/bin/perl
  2. open F, "som_file.txt";
  3. my @f = <F>;

  4. open T, "table.txt";
  5. my @t = map { s/,/ /g; [split] } <T>;

  6. for my $u (@t) {
  7.     my @g = @f;
  8.     for my $j ( 0 .. @$u - 1 ) {
  9.         @g = grep { /$u->[$j]/ } @g;
  10.     }
  11.     print @g ? 1 : 0, "\n";
  12. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP