任务:
批量提取某个目录下所有文档的特定列.
如:提取"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);