免费注册 查看新帖 |

Chinaunix

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

文件匹配与统计 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-11-15 11:26 |只看该作者 |倒序浏览
本帖最后由 iamline 于 2017-11-15 11:34 编辑

本人有大概6000+文件需要统计,每每不得果,想寻求帮助

这6000+文件以list的形式给出,例子如下:
more list
  1. E350        /path/E350.bsn.tab.filt
  2. E371        /path/E371.bsn.tab.filt
  3. E384        /path/E384.bsn.tab.filt
  4. ……
复制代码
$0是样本名,$1是对应的统计文件,大概有6000+行。


这个$1统计文件是序列的比对结果文件,格式大概是:
more blastn.txt
  1. chu        288        1        288        T32-Genome        5099311        4870810        4870523        0.98        --        0        288        506        1e-144        --        --
  2. yja        211        1        211        T32-Genome        5099311        357009        357219        0.99        --        0        211        372        1e-104        --        --
  3. Tsp        153        1        153        T32-Genome        5099311        213981        214133        0.98        --        0        153        262        5e-71        --        --
  4. arp        400        1        389        T32-Genome        5099311        363499        363887        0.93        --        0        389        585        1e-167        --         --
  5. trp        220        1        220        T32-Genome        5099311        1999800        1999581        0.94        --        0        220        343        3e-95        --        --
复制代码



我想达到的目的是:
我给一个判断文件,如:
more gene.txt
  1. chu
  2. yja
  3. Tsp
复制代码
如果上面list的6000+个文件($1,格式如blastn.txt),第一列的name id与我给的判断文件(gene.txt)中的name id的种类一样,有重复没关系,但是不能多,就输出对应的样本名


本人初学者,大概写了一个,但是在条件判断上处理不对,很希望得到帮助,非常感谢啊~
  1. die "\nusage: perl $0 <blast.list> <gene list> \n\n" unless @ARGV == 2;
  2.         
  3. my $file = shift;
  4. my $gene = shift;
  5.       
  6. my %namelist;
  7. my @all;
  8.         
  9. open (GM, "<$gene") or die;
  10. while(<GM>) {
  11.         chomp($_);
  12.         next if (/^\s*$|^#+/);
  13.         my @list = split /\s+/, $_;
  14.         my ($name, $ident) = ($list[0], $list[1]);
  15.         $namelist{$name} = 0;
  16. }      
  17. close(GM);
  18.       
  19.         #print STDERR "$.\n";
  20.         while(my $line=<IN>){
  21.                 chomp $line;
  22.                 next if ($line=~/^Query_id/);
  23.                 my @b=split /\s+/,$line;
  24.                 if(exists $namelist{$b[0]}){
  25.                         #$namelist{$b[0]}++;
  26.                         $index++;
  27.                 }
  28.         }
  29.       
  30.                 #if($namelist{$b[0]}>=1){
  31.                 #       $index++;
  32.                 #}
  33.       
  34.         if($index==keys %namelist){
  35.                 push @all, $a[0];
  36.         }
  37. }
  38. close(LIST);

  39. my $all=join "\n",@all;     
  40. print "$all\n";
复制代码







论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2017-11-15 14:19 |只看该作者
你的表述我怎么还没看懂啊?

论坛徽章:
0
3 [报告]
发表于 2017-11-15 15:23 |只看该作者
回复 2# sohusina

表述是有点多啊~
其实就是搜索比对结果文件,只出现我指定的gene,就输出样本名;如果还出现其他基因,就舍弃


论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
4 [报告]
发表于 2017-11-16 18:02 |只看该作者
回复 3# iamline

我也没看明白.

能不能举个栗子 ?

论坛徽章:
0
5 [报告]
发表于 2017-11-16 18:41 |只看该作者
我也没看明白.

举个栗子 ?
  • name id的种类一样?
  • 有重复, 没关系?
  • 不能多?

论坛徽章:
0
6 [报告]
发表于 2017-11-21 15:34 |只看该作者
回复 5# Okelani

已经解决了  谢谢啦 ~

论坛徽章:
0
7 [报告]
发表于 2017-11-21 16:02 |只看该作者
回复 4# q1208c

后来折腾着解决了 谢谢啦~

论坛徽章:
0
8 [报告]
发表于 2017-11-22 15:08 |只看该作者
  1. die "\nusage: perl $0 <blast.list> <gene list> \n\n" unless @ARGV == 2;

  2. my $file = shift;
  3. my $gene = shift;

  4. my %namelist;
  5. my @all;

  6. open (GM, "<$gene") or die;
  7. while(<GM>) {
  8.         chomp($_);
  9.         next if (/^\s*$|^#+/);
  10.         my @list = split /\s+/, $_;
  11.         my ($name, $ident) = ($list[0], $list[1]);
  12.         $namelist{$name} = 0;
  13. }
  14. close(GM);


  15. open (LIST, "<$file") or die;
  16. while(<LIST>){
  17.         chomp;
  18.         my @a=split;
  19.         open IN,$a[1];       
  20.         my $exit=0;
  21.         my $rup=0;
  22.         my @b;       
  23.         <IN>;
  24.         my @line=<IN>;
  25.         chomp @line;
  26.         foreach my $tmp(@line){
  27.                 @b = split /\s+/,$tmp;
  28.                 if(exists $namelist{$b[0]}){
  29.                         $namelist{$b[0]}++;
  30.                         $exit++;
  31.                 }else{
  32.                         $rup++;
  33.                 }
  34.         }
  35.        

  36.         if($namelist{$b[0]}>=1 && ($exit>=keys %namelist) && $rup==0){
  37.                 push @all, $a[0];
  38.         }
  39. }
  40. close(LIST);


  41. my $all=join "\n",@all;     
  42. print "$all\n";
复制代码


附上解决了的代码  给有需要的人。。。

评分

参与人数 1信誉积分 +5 收起 理由
rubyish + 5 赞一个! XXle ! 3Q ~~

查看全部评分

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP