数据挖掘 发表于 2013-1-26 14:49:43

perl自动修改mol2中错误的N原子类型Nar-Npl3

#!/usr/bin/perl
#修改3处错误;
#默认可能有两个Nar,当时没有考虑有3个Nar
#我认为只有1个Nar需要修改,可能有两个Nar 需要修改
#在这里的时候要稍微注意下,经过修改让trueID返回数组
subatomtype2id{
$atomtype=$_;
@text=@{$_};
#print "@text";
foreach $line(@text){

   #print "$line";
   if($line=~/\s+(\d+)\s+\w+\s+\S+\s+\S+\s+\S+\s+$atomtype/)
   {
    #print "$1 \n";
   push @narid,$1;
   
   
   }
   
}
   
   return @narid;
}

#指定定原子类型返回@ids;
subtrueID{
    @nums=@_;
#print join(' ',@nums);
foreach $num(@nums)
{
foreach $line(@text)
{
   if($line=~/^\s+\d+\s+$num\s+(\d+)\s+(\S+)$/ || $line=~/^\s+\d+\s+(\d)+\s+$num\s+(\S+)$/ )
    {
   $tempid=$1;
   $bondtype=$2;
   if($bondtype=~/1/){
      
      push @trueids, $num;
   }
   }

   }
}

return @trueids;
}


$atomtype='N.ar';
open FH, "F:/task/test/segment1005.mol2";
@text=<FH>;
@narid=&atomtype2id("N.ar",\@text); ##获得所有Nar的类型原子的ID 编号
@trueids=&trueID(@narid);

while(@trueids!=0)
{
$getid=shift @trueids; #从里面依次取出id;

   foreach $line(@text)
       {
         if($line=~/(^\s+$getid\s+\w+\s+\S+\s+\S+\s+\S+\s+)($atomtype\s+)(.+$)/)   
         {
         
         print $1;
         printf("%-11s",'N.pl3');
         print $3;
         print "\n";
         }
         #    1   1   2 ar
      elsif ($line=~/(^\s+\d+\s+\d+\s+$getid\s+)(\S+)$/ || $line=~/(^\s+\d+\s+$getid\s+\d+\s+)(\S+.+)$/)
      {
         #    6   3   7 1
         print $1;
         printf("%-2d" ,"1");
         print "\n";
         
      }else{
          print $line;
         print $_;
      }
      }
      
}















subatomtype2id{
$atomtype=$_;
@text=@{$_};
#print "@text";
foreach $line(@text){

   #print "$line";
   if($line=~/\s+(\d+)\s+\w+\s+\S+\s+\S+\s+\S+\s+$atomtype/)
   {
    #print "$1 \n";
   push @narid,$1;
   
   
   }
   
}
   
   return @narid;
}

批量处理,自己加个循环,或者联系我qq 1679088991

川大-灰太狼 发表于 2013-1-28 21:57:08

呵呵 谢谢 数据挖掘的分享!
页: [1]
查看完整版本: perl自动修改mol2中错误的N原子类型Nar-Npl3