免费注册 查看新帖 |

Chinaunix

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

匹配查找 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-06 12:06 |只看该作者 |倒序浏览
data1:
Lvex_GLEAN_10009875        22        127558        0.0172(%)
Lvex_GLEAN_10019469        1        11763        0.0085(%)
Lvex_GLEAN_10018505        3        2676        0.1121(%)
Lvex_GLEAN_10009337        8        56232        0.0142(%)
Lvex_GLEAN_10027616        1        24555        0.0041(%)
Lvex_GLEAN_10007746        9        9285        0.0969(%)
Lvex_GLEAN_10025923        32        14298        0.2238(%)
Lvex_GLEAN_10020097        5        858        0.5828(%)
Lvex_GLEAN_10011197        9        99188        0.0091(%)
Lvex_GLEAN_10012348        1        5877        0.0170(%)
-----------------------------------------------------------------
data2:
>1
Lvex_GLEAN_10001210
ENSP00000229270
Lvex_GLEAN_10027311
>2
Lvex_GLEAN_10001590
Lvex_GLEAN_10002349
Lvex_GLEAN_10001478
Lvex_GLEAN_10002928
Lvex_GLEAN_10002839
Lvex_GLEAN_10003104
Lvex_GLEAN_10002596
ENSP00000357838
Lvex_GLEAN_10001988
Lvex_GLEAN_10001090
>3
ENSP00000231420
Lvex_GLEAN_10012304
>4
Lvex_GLEAN_10003401
>5
Lvex_GLEAN_10014102
Lvex_GLEAN_10001890
Lvex_GLEAN_10012494
Lvex_GLEAN_10003187
>6
ENSP00000296486
Lvex_GLEAN_10000360
Lvex_GLEAN_10019616
>7
ENSP00000310978
Lvex_GLEAN_10013798
>8
ENSP00000375069
>9
ENSP00000381949
Lvex_GLEAN_10010526


要在data1中第一列的每一个Lvex在data2中查找对应的ENSP号,data2中每个>下面是一组,请注意,有的组别中只有Lvex有的只有ENSP。
找到对应的ENSP后在data1的后面追加新的对应一列ENSP号。谢谢各位了请教一下这个如何匹配。关键是以每个>来看,而且有的时候Lvex在ENSP上方有的在下方也就是他俩的相对位置不固定,但是都在同一个>里

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-09-06 13:33 |只看该作者
我就不优化了~
  1. #!/usr/bin/perl -w

  2. my($d1, $d2) = @ARGV;
  3. my %h;
  4. open D1,"< $d1" || die $!;
  5. open D2,"< $d2" || die $!;

  6. $/=">";
  7. <D2>;
  8. while(<D2>){
  9.         chomp;
  10.         my @tmp = (split /\n/,$_);
  11.         my @key;
  12.         my $value = "";
  13.         for my $i (@tmp){
  14.                 push @key,$i if $i =~/^Lvex_GLEAN_/;
  15.                 $value = $i if $i =~/^ENSP/;
  16.         }
  17.         map{$h{$_} = $value;}@key;
  18. }
  19. $/="\n";
  20. close D2;
  21. while(<D1>){
  22.         chomp;
  23.         my $k = (split)[0];
  24.         $h{$k} ||= "";
  25.         print "$_\t$h{$k}\n";
  26. }
  27. close D1;
复制代码
建议楼主下次发数据的时候带有输出结果的

论坛徽章:
0
3 [报告]
发表于 2014-09-06 14:04 |只看该作者
回复 2# huang6894


    @data=<INFILE>;

my $count=0;
my $count2=1;
my $Lvex;
my $y;

while(<INFILE2>){
        @b=split(" ");
        $Lvex[$count]=$b[0];
        $count+=1;
}

foreach $u(0..20){
foreach $y(0..100){
         if($data[$y] =~ m/$Lvex[$u]/){
                 foreach (1..10){
                 if($data[($y+$_)] =~ m/ENSP/){
                         print OUTFILE $Lvex[$u]."  ".$data[($y+$_)];
                         #$count2+=1;
                 }
                 elsif($data[($y+$_)] =~ m/>/){
                         last;
                 }}
                 foreach (1..10){
                 if($data[($y-$_)] =~ m/ENSP/){
                         print OUTFILE $Lvex[$u]."  ".$data[($y-$_)];
                         #$count2+=1;
                 }
                 elsif($data[($y-$_)] =~ m/>/){
                         last;
                 }
                 }
                 last;
         }       
        }


}

我自己也用笨拙的方式实现了一下。这个还不是最终的,看似你的比较高级,先回帖在学习。祝中秋快乐。谢谢你

论坛徽章:
0
4 [报告]
发表于 2014-09-06 14:04 |只看该作者
  1. #! /usr/bin/perl -w
  2. use strict;
  3. die "#usage:perl $0 <data1><data2>\n" unless @ARGV==2;
  4. my ($d1,$d2)=@ARGV;
  5. open IN,$d2||die;
  6. my %ha;
  7. $/=">";<IN>;$/="\n";
  8. while(<IN>){
  9.         my $id=$1 if /^(\S+)/;
  10.         $/=">";chomp(my $con=<IN>);$/="\n";
  11.         my @p=split/\n/,$con;
  12.         next if @p==1;
  13.         my @gene=grep /^ENSP/,@p;
  14.         next if @gene != 1;
  15.         foreach (@p){
  16.                 $ha{$_}=$gene[0] if $_ ne $gene[0];
  17.         }
  18. }
  19. close IN;
  20. open IN,$d1||die;
  21. while(<IN>){
  22.         chomp;
  23.         my @a=split;
  24.         my $out= exists $ha{$a[0]} ? "$_\t$ha{$a[0]}\n" : "$_\tNA\n";
  25.         print $out;
  26. }
  27. close IN;
复制代码

论坛徽章:
0
5 [报告]
发表于 2014-09-06 14:08 |只看该作者
你的19行不严谨,有的没有值,或者有的就没有key回复 2# huang6894


   

论坛徽章:
0
6 [报告]
发表于 2014-09-06 14:10 |只看该作者


回复 4# felix0608


非常感谢,你们的方法都好高级,我地好笨拙的感觉。。。忙完之后一定仔细研读你们写的哈希,谢谢啦,祝中秋愉快哦。

   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
7 [报告]
发表于 2014-09-06 15:12 |只看该作者
回复 5# felix0608


    谢谢,我的想法是,事先定义了一个空值,如果某段内没有值,它们的键指向这个空置,如果某段没有键,不会执行哈希赋值的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP