2017-12-29 63 views
-1

こんにちは、私に助けてくれてありがとう!perlスクリプトでいくつかの変更を加える方法

私は分類学的割り当て(qiimeのリスト)のリストを持っており、txtファイルのリストを使ってバクテリアのリストを抽出したいと思います。私はこのコードを持っています.2つの問題があります。一つは、分類ファイルに#(qiimeのリスト)で始まる行が2行あり、最初のもの(#biomファイルから構築されたもの)は避けたいものです。 1(#OTUのID .....サンプルは)私は、コードの別の場所に

if ($_=~ m/Constructed from biom file/){ next; }

のようなものを試してみました、私は、各列の名前として使用するものであるが、それはちょうどドン(ただし、ファイルからその行を削除するとうまくいく)が、ファイルを操作したくないということが、その行を避けたいのです。

2番目の問題(よくわかっているコードの一部です)は、スクリプトに-sオプションが付いています。つまり、特定の列が必要な場合は、 (例:-s sample1、sample2、sample..n)、問題は選択されたサンプルが特定の行(xRow 0.0 0.0 0.0)のすべての列でcero(0)の値を持つことですその場合、スクリプトでは$ val [1]を使用することを避けなければなりませんが、それは1つのサンプルのためのものですが、2つまたはmoresサンプルでは、​​すべての行(この場合は3つのサンプル) 。

スクリプト:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Getopt::Long; 
use Data::Dumper qw(Dumper); 
use List::MoreUtils qw(uniq); 
use List::Util qw(sum); 

    my ($search_label, $infile_taxon, $infile_list, $output_file); 

     GetOptions (
      'i=s' =>\$infile_taxon, 
      'l=s' =>\$infile_list, 
      's=s' =>\$search_label, 
      'o=s' =>\$output_file, 
      ); 

     sub match_genera { 
      my ($List_File, $Taxon_File) = @_; 
      my @lista_genera = @{ $List_File }; # dereferencing and copying each array 
      my @taxon_qiime = @{ $Taxon_File }; 
      my (@extract); 
       foreach (@lista_genera){ 
        my $unit = $_; 
        chomp $unit; 
        my @match = grep (/$unit/, @taxon_qiime); 
          push (@extract, @match); 
       } 
       return @extract; 
     } 



    open INFILE_TAXONOMY, '<', "$infile_taxon" or die $!; 
    open LIST_BACTERIA, '<', "$infile_list" or die $!; 
    open OUTPUT, '>', "xfile2.txt" or die $!; 

    chomp (my @sample_names = split '\t', <INFILE_TAXONOMY>); 
    shift @sample_names; 
    unshift @sample_names, '#Genera'; 

    my (@ToExtract, @no_match, @filter, @filter_columns); 

    # si ingresamos un -s 
    if ($search_label){ 
     my @wanted= split (/\,/, $search_label); 
     unshift @wanted, '#Genera'; 
     @wanted = uniq (@wanted); 

     foreach my $wanted_in (@wanted){ 
      if (my @match = grep (/$wanted_in/, @sample_names)) { 
       push (@ToExtract, @match); 
      } 
      else { 
       push (@no_match, $wanted_in); 
      } 
     } 

     if (grep {defined($_)} @no_match){ 
      print "\nSamples No Found: @no_match\n\n"; 
     } 
     print OUTPUT join "\t", @ToExtract, "\n"; 
    } 

    # si queremos toda la tabla !! 
    else{ 
     @ToExtract = @sample_names; 
     print OUTPUT join "\t", @ToExtract, "\n"; 
    } 

    # Extraer los varoles de cada linea para cada variable !!! 
    #my %row; 
    while (<INFILE_TAXONOMY>){ 
     my %row; 
     @row{@sample_names} = split "\t"; 
     @filter= join "\t", @row{@ToExtract}; 
      push (@filter_columns, @filter); # ahora ya se puede usar con la 
    } 

    my @list; 
    foreach (<LIST_BACTERIA>){ 
     if ($_=~ m/^#|^$/) { next;   } 
     else    { push @list, $_ } 
    } 
    my @filter_list = uniq (@list); 

    my @last = match_genera (\@filter_list, \@filter_columns); 

    my (@genera_taxon, @genera_final); 
    foreach (@last){ 
     @genera_taxon = ($_ =~ m/;D_5__(\w.*)/g); 
        foreach (@genera_taxon){ 
         if ($_ =~ m/^$/g) { next;     } 
         else    { push @genera_final, $_; } 
        } 
    } 

     foreach (@genera_final){ #split the line in a multiples var !!! 
      chomp; 
        my @val = split (/\t/, $_); 
        foreach ($val[1]){ 
         if ($_ == 0){ next; } 
         else{print join "\t", @val,"\n";} 
        } 

       } 

close INFILE_TAXONOMY; 
close LIST_BACTERIA; 
close OUTPUT; 
exit; 

分類学上のファイル(qiimeのリスト)は、タブ区切りのテキストです!!!:

#Constructed from biom file 
#OTU ID sample1 sample2 sample3 
D_0__Bacteria;D_1__Acidobacteria;D_2__Holophagae;D_3__Subgroup 10;D_4__ABS-19;D_5__uncultured bacterium 0.002804 0.0073441109 0.0 
D_0__Bacteria;D_1__Acidobacteria;D_2__Holophagae;D_3__Subgroup 10;D_4__CA002;D_5__uncultured bacterium 0.0 0.001109 0.0 
D_0__Bacteria;D_1__Acidobacteria;D_2__Holophagae;D_3__Subgroup 10;D_4__Sva0725;D_5__uncultured bacterium 0.0 0.00882217 0.0014038202 
D_0__Bacteria;D_1__Acidobacteria;D_2__Holophagae;D_3__Subgroup 7;D_4__uncultured bacterium;D_5__ 0.0 0.0 0.00898876404 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 13;Ambiguous_taxa;D_4__;D_5__ 0.0 0.0 0.00140449438202 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 2;D_3__uncultured bacterium;D_4__;D_5__ 0.0 0.0 0.00280898876404 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 21;D_3__uncultured bacterium;D_4__;D_5__ 0.0 0.0 0.00421348314607 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 22;D_3__uncultured bacterium;D_4__;D_5__ 0.0 0.0 0.00421348314607 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 22;D_3__uncultured prokaryote;D_4__;D_5__ 0.0 0.0 0.0014038202 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 25;D_3__uncultured Acidobacteria bacterium;D_4__;D_5__ 0.0012041933 0.0 0.0 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 5;D_3__uncultured bacterium;D_4__;D_5__ 0.00120401933 0.0 0.0 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 6;D_3__uncultured Acidobacteria bacterium;D_4__;D_5__ 0.0 0.00115473441109 0.0 
D_0__Bacteria;D_1__Acidobacteria;D_2__Subgroup 6;D_3__uncultured bacterium;D_4__;D_5__ 0.00180614087899 0.0 0.00280898876404 
D_0__Bacteria;D_1__Actinobacteria;D_2__Acidimicrobiia;D_3__Acidimicrobiales;D_4__OM1 clade;D_5__uncultured actinobacterium 0.0 0.0 0.00140449438202 
D_0__Bacteria;D_1__Actinobacteria;D_2__Acidimicrobiia;D_3__Acidimicrobiales;D_4__OM1 clade;D_5__uncultured bacterium 0.0 0.0 0.00561797752809 
D_0__Bacteria;D_1__Actinobacteria;D_2__Acidimicrobiia;D_3__Acidimicrobiales;D_4__Sva0996 marine group;D_5__uncultured bacterium 0.0 0.0 0.00280898876404 
D_0__Bacteria;D_1__Actinobacteria;D_2__Acidimicrobiia;D_3__Acidimicrobiales;D_4__uncultured;D_5__uncultured actinobacterium 0.00301023479831 0.00115473441109 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Acidimicrobiia;D_3__Acidimicrobiales;D_4__uncultured;D_5__uncultured bacterium 0.000602059663 0.001173441109 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Corynebacteriales;D_4__Dietziaceae;D_5__Dietzia 0.0150511739916 0.0311778290993 0.00140449438202 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Corynebacteriales;D_4__Mycobacteriaceae;D_5__Mycobacterium 0.00240818865 0.002309882217 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Corynebacteriales;D_4__Nocardiaceae;D_5__Gordonia 0.0 0.0 0.00140449438202 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Corynebacteriales;D_4__Nocardiaceae;D_5__Rhodococcus 0.00240865 0.0013441109 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Corynebacteriales;D_4__Nocardiaceae;D_5__Williamsia 0.0 0.0 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Corynebacteriales;D_4__Tsukamurellaceae;D_5__Tsukamurella 0.000020463 0.0 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Corynebacteriales;D_4__nbr16a11;D_5__uncultured bacterium 0.0014093 0.001134411 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Kineosporiales;D_4__Kineosporiaceae;D_5__Quadrisphaera 0.0 0.0014734 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Micrococcales;D_4__Demequinaceae;D_5__Lysinimicrobium 0.00120409391933 0.0 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Micrococcales;D_4__Intrasporangiaceae;D_5__Ornithinimicrobium 0.0006959663 0.0 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Micrococcales;D_4__Intrasporangiaceae;D_5__Tetrasphaera 0.0 0.00441109 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Micrococcales;D_4__Micrococcaceae;D_5__Glutamicibacter 0.0 0.0031408776 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Micrococcales;D_4__Micrococcaceae;D_5__Pseudarthrobacter 0.0 0.002882217 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Micromonosporales;D_4__Micromonosporaceae;D_5__Actinoplanes 0.0 0.0011441109 0.0 
D_0__Bacteria;D_1__Actinobacteria;D_2__Actinobacteria;D_3__Propionibacteriales;D_4__Propionibacteriaceae;D_5__Propionibacterium 0.3479831 0.0882217 0.00280898876404 

リスト:期待

#list 
Gordonia 
Mycobacterium 
Ornithinimicrobium 
Marinobacter 
Pseudoalteromonas 
Pseudomonas 
Halomonas 
Alcanivorax 
Acinetobacter 
Shewanella 
Pseudidiomarina 
Microbulbifer 
Bacillus 
Microbacterium 
Achrornobacter 
Actinomyces 
Alcaligenes 

がプリントアウト(タブ区切り文字):

#genera sample1  sample3 
Gordonia 0.00301023479831 0.00140449438202  
Mycobacterium 0.00240818783865 0.0 
Ornithinimicrobium 0.000602046959663 0.0 
Pseudomonas 0.367850692354 0.254213483146 
Halomonas 0.000602046959663 0.00140449438202  
Acinetobacter 0.00301023479831 0.00561797752809  
Bacillus 0.0626128838049 0.00280898876404  
Klebsiella 0.0138470800722 0.00280898876404  
Lactobacillus 0.000602046959663 0.0 
Acinetobacter 0.00301023479831 0.00561797752809  
Gordonia 0.00301023479831 0.00140449438202  
Rhodococcus 0.00240818783865 0.0 
Williamsia 0.000602046959663 0.0 
Streptomyces 0.000602046959663 0.0 
Dietzia 0.0150511739916 0.00140449438202  
Aquabacterium 0.000602046959663 0.0 
Janthinobacterium 0.0180614087899 0.0294943820225 
Massilia 0.000602046959663 0.00140449438202  
Noviherbaspirillum 0.000602046959663 0.0 
Rhodococcus 0.00240818783865 0.0 
Staphylococcus 0.166164960867 0.0688202247191 
Haemophilus 0.00120409391933 0.00280898876404  
Stenotrophomonas 0.000602046959663 0.00140449438202  
Candidatus Endomicrobium 0.00662251655629 0.0 
Candidatus Hepatincola 0.000602046959663 0.0 

最後に、コードをもっとシンプルにしようとしました。新しいスクリプトでは、< INFILE_TAXONOMYの代わりに@newarrayを使用してコードの一部を編集しようとしていますが、新しい配列では、リストはほぼ完成しています(期待される出力のように)望みの列を選択するだけで済むように、配列の次の部分を作る方法

特定の列を選択するオプションのない新しいスクリプト!!!

use strict; 
use warnings; 
use List::MoreUtils qw(uniq); 
use Data::Dumper qw(Dumper); 


#---------------------------Subrutina de extraccion para 2 arrays de lista de bacterias y taxones!!------------------------------------------------------------- 
     sub match_genera { 
      my ($List_File, $Taxon_File) = @_; 
      my @taxon_qiime = @{ $Taxon_File }; 
      my @lista_genera = @{ $List_File }; # dereferencing and copying each array 
      my (@match, @extract, @genera_clean); 

        foreach (@taxon_qiime){ 
        my @generas_taxon = ($_ =~ m/;D_5__(\w.*)/g); 
        foreach (@generas_taxon){ 
         if ($_ =~ m/^$/g) { next;     } 
         else    { push @genera_clean, $_; } 
        } 
        } 

        foreach (@lista_genera){ 
        my $list_unit = $_; 
        chomp $list_unit; 
        @match = grep (/$list_unit/, @genera_clean); 
          push (@extract, @match); 
        }   
       return @extract; 
     } 
#------------------------------------------------------FILES----------------------------------------------------------------------- 



      open INFILE_TAXONOMY, '<', "otu_table_L6_copy.txt" or die $!; 
      open LIST_BACTERIA, '<', "lista_degradadoras.txt" or die $!; 

      my (@lista_bacteria, @taxon, @sample_names); 


# -------------------------------------------------------------TAXON ------------------------------------------------------------- 
       foreach (<INFILE_TAXONOMY>){ 
        chomp; 
        if ($_=~ m/^$|Constructed from biom file/g) { next;      } 
        elsif ($_ =~ s/OTU ID/Genera/g)    { push @sample_names, $_; } 
        else           { push (@taxon, $_);   } 
       } 


# -------------------------------------------------------------LIST ------------------------------------------------------------- 
       foreach (<LIST_BACTERIA>){ 
        if ($_=~ m/^$|^#/g)  { next;     } 
        else     { push @lista_bacteria, $_  } 

       } 
      my @filter_list = uniq (@lista_bacteria); 

# ------------------------------------------------------------------------------------------------------------------------------- 


      my @match_all = match_genera (\@filter_list, \@taxon); 

      unshift @match_all, @sample_names; 

      @wanted= qw(sample1 sample3); 

      foreach (@match_all){ 
       print "$_\n"; 
       } 

      close INFILE_TAXONOMY; 
      close LIST_BACTERIA; 
      exit; 

答えて

0

、第二の選択肢はうまく機能し、おかげでそんなに感謝を

<INFILE_TAXONOMY>; # Skip first line. 
chomp (my @sample_names = split '\t', <INFILE_TAXONOMY>); 

または

my $sample_names; 
while ($sample_names = <INFILE_TAXONOMY>) { 
    chomp($sample_names); 
    last if $sample_names !~ /Constructed from biom file/; 
} 

defined($sample_names) 
    or die("Premature EOF"); 

my @sample_names = split /\t/, $sample_names; 
+0

chomp (my @sample_names = split '\t', <INFILE_TAXONOMY>); 

を交換してください! – abraham

関連する問題