生物信息编程

🐫[perl]批量提取某个目录下所有文档的特定列,并整合到一个表

2019-11-07  本文已影响0人  郑宝童

任务:

批量提取某个目录下所有文档的特定列.
如:提取"E:\test"下所有maf.txt结尾的文件的Entrez_Gene_Id列,并合并输出到result.txt

perl代码实现:

use strict;
use warnings;
####需要输入的变量
my $ExpPath="E:\\test";####文件目录 [修改]
my $OutputPath="E:\\test\\result.txt"; ####结果整合结果存放的位置 [修改]
#####输入变量结束

opendir DIR,$ExpPath or die "can't open   $ExpPath \n";
my $sum_Sampel=0;###样本量计数
my @Exp="";###存储输出信息
my $Expi=0;
while(my $file=readdir(DIR)){
    if($file=~/\.maf.txt$/){                            #提取相应的文件: 例如:maf.txt [修改]
    $sum_Sampel++;
    $Expi=0;
    if($sum_Sampel==1){
    open (IN,"$ExpPath/$file") or die "can't open  $file \n";
    $Exp[$Expi]=$file;
    <IN>;
    <IN>;       #三个IN是为了 跳过开头三行
    <IN>;
    my $col=0;
    while(chomp(my $line=<IN>)){
    my @name=split(/\t/,$line);
    my $len=@name;
    for(my $i=0;$i<$len;$i++){
    if($name[$i] eq "Entrez_Gene_Id"){                     # Entrez_Gene_Id改成列名 [修改]
    $Expi++;
    $Exp[$Expi]=$name[$i];
    $col=$i;
    last;
    }
    }
    if ($col !=0){
    last;
    }
    }
    while(<IN>){
    $Expi++;
    chomp($_);
    my @name=split(/\t/,$_);
    $Exp[$Expi]=$name[$col];
    }
    close(IN);
    }   #end while

    
    if($sum_Sampel>1){
    open (IN,"$ExpPath/$file") or die "can't open  $file \\n";
    $Exp[$Expi]="$Exp[$Expi]\t$file";
    <IN>;
    <IN>;
    <IN>;
    my $col=0;
    while(my $line=<IN>){
    chomp($line);
    my @name=split(/\t/,$line);
    my $len=@name;
    for(my $i=0;$i<$len;$i++){
    if($name[$i] eq "Entrez_Gene_Id"){                                        # Entrez_Gene_Id改成列名     [修改]                                     
    $Expi++;
    $Exp[$Expi]="$Exp[$Expi]\t$name[$i]";
    $col=$i;
    last;
    }
    }
    if ($col !=0){
    last;
    }
    }
    while(<IN>){
    $Expi++;
    chomp($_);
    my @name=split(/\t/,$_);
    $Exp[$Expi]="$Exp[$Expi]\t$name[$col]";
    }
    close(IN);
    }
    }   #end while
    }
    print "'\$Expi' is $Expi";
  open (OUT,">$OutputPath") or die "can't open  $OutputPath \\n";
  for(my $j=0;$j<=$Expi;$j++){
  print OUT "$Exp[$j]\n";
  }
  close(OUT);



上一篇 下一篇

猜你喜欢

热点阅读