0

qiime 分析から取得した 2 つの形式があります。1 つは silva データベースから取得し、もう 1 つは GreenGenes から取得しました。これらのファイルの違いは、silva ファイルには分類群ごとにプログレッシブ D_number (kingdom= D_0__、phylum= D_1__、clase= D_2__ など) があり、GreenGenes ファイルには各分類群に文字 (kingdom= K__、phylum= p__) があることです。 、clase= c__ など)

file_1 (Silva format)
D_0__Archaea;D_1__Euryarchaeota;D_2__Thermoplasmata;D_3__Thermoplasmatales;D_4__ASC21;D_5__uncultured euryarchaeote



file_2(GreenGenes format)
k__Bacteria;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Streptomycetaceae;g__Streptomyces

そこで、Perl で 2 つのスクリプト (Silva 用と GreenGenes 用) を作成し、各分類群を個別のファイルに抽出しました。

両方の形式の一致セクションにコードを組み込もうとしています。つまり:

16 行目では、次のような 2 つのオプションが必要です。

my @kingd=($taxon_value[0]=~m/D_0__(.*);D_1/g | m/k__(.*);p/g);

まあ、それがうまくいかないことはわかっています

では、正規表現の一致のために同じ行に2つ以上のオプションを追加するにはどうすればよいですか??

これはスクリプトの一部です (オプションは 6 つあり、Kingdom オプションを記述しただけです !!):

while (<INPUTFILE>){
    $line=$_;
    chomp($line);
    if ($line=~ m/^#/g){
        next;
    }
    elsif ($line=~ m/^[Uu]nassigned/g){
        next;
    }
    elsif ($line){
        my @full_line = $_;
        foreach (@full_line){
            my (@taxon_value)= split (/\t/, $_);
            foreach ($taxon_value[0]){
                if ($kingdom){
                    my @kingd=($taxon_value[0]=~m/D_0__(.*);D_1/g); # just for silva
                    foreach (@kingd){
                        if ($_=~/^$/){
                            next;
                        }
                        elsif ($_=~ m/^[Uu]nknown/g){
                            next;
                        }
                        elsif ($_=~ m/^[Uu]ncultured$/g){
                            next;
                        }
                        elsif ($_=~ m/^[Uu]nidentified$/g){
                            next;
                        }
                        else {
                            push @taxon_list, $_;
                        }
                    }
                }
           }
      }
 }

ありがとう

4

1 に答える 1

2

パターンの内側でorを実行する必要があります。|すでに持っているパイプでそれを行います。しかし、それはパターンに入る必要があります。2 つの一致演算子を持つ必要はありません。

my @kingd = $taxon_value[0] =~ m/D_0__(.*);D_1|k__(.*);p/g

これで、どちらか一方に一致します。詳細については、 perlreperlretutを参照してください。多くの便利なツールへのリンクが含まれているため、SO の正規表現タグ wiki で提供されている情報も読む必要があります。

コードで実行していてうまくいかなかったのは、ビットごとの or|である Perl の演算子を使用することです。

于 2016-10-27T21:06:21.447 に答える