パターン間の文字列を識別し、文字列が見つかるとパターン間の領域全体を印刷します。 awkを使用する方が良い

パターン間の文字列を識別し、文字列が見つかるとパターン間の領域全体を印刷します。 awkを使用する方が良い

同様の質問がありますが、私が経験している問題を完全に解決することはありません。

簡単に言えば、探している文字列を含むすべてのブロックを印刷する必要があります。各ブロックの開始行には次のものが含まれます。 <アイテムバージョン=

詳しくは下記をご覧ください。

パターン領域(ブロック)内で特定の文字列が認識されたら、パターン間の領域全体(ブロック)を印刷する大容量ファイル(数十万行)を検索したいと思います。

以下を使用して、パターン間の領域全体を印刷できることを知っています。ここで、これらのブロックの始まりと終わりの識別子は「/<entry version=」です。 awk '/<entry version=/{flag=1} flag; /<entry version=/{flag=0}'

しかし、これらのパターンの間に特定の文字列が見つかった場合にブロック全体を印刷するにはどうすればよいですか?

チャンク領域の場合、実際のデータの最も短い部分は次のとおりです(各チャンクの長さは実際には数千減らすにもかかわらず)。私が使用できるより良い例を一緒に作ったTerdonに感謝します。

<entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000003">   
        <name>TSPAN6</name>                                                                                                                             
        <synonym>T245</synonym>
        <synonym>TM4SF6</synonym>
        <synonym>TSPAN-6</synonym>
        <identifier id="ENSG00000000003" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
                <xref id="O43657" db="Uniprot/SWISSPROT"/> 
                <xref id="7105" db="NCBI GeneID"/>
        </identifier>  
        <proteinClasses>   
                <proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>     

上記の実際の形式では、特定の文字列の名前と同義語をチェックしているので、「TSPAN6」が見つかると、対応するブロックが印刷されます。各ブロックには数千の行があるので、以下はブロック内の文字列一致に基づいてブロックを印刷する方法を構成するミニバージョンです。

以下は、文字列が「MEMSAT」と「TNMD」の
入力例の場合の例です。

 <entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000003">
        <name>TSPAN6</name>
        <synonym>T245</synonym>
        <synonym>TM4SF6</synonym>
        <synonym>TSPAN-6</synonym>
        <identifier id="ENSG00000000003" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
            <xref id="O43657" db="Uniprot/SWISSPROT"/>
            <xref id="7105" db="NCBI GeneID"/>
        </identifier>
        <proteinClasses>
            <proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>
            <proteinClass source="Ezkurdia et al 2014" id="Eb" parent_id="" name="Protein evidence (Ezkurdia et al 2014)"/>
        </proteinClasses>
        <proteinEvidence evidence="Evidence at protein level">
            <evidence source="HPA" evidence="Evidence at transcript level"/>
            <evidence source="MS" evidence="Not available"/>
            <evidence source="UniProt" evidence="Evidence at protein level"/>
        </proteinEvidence>
  </entry>
    <entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000005">
        <name>TNMD</name>
        <synonym>BRICD4</synonym>
        <synonym>ChM1L</synonym>
        <synonym>myodulin</synonym>
        <synonym>TEM</synonym>
        <synonym>tendin</synonym>
        <identifier id="ENSG00000000005" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
            <xref id="Q9H2S6" db="Uniprot/SWISSPROT"/>
            <xref id="64102" db="NCBI GeneID"/>
        </identifier>
        <proteinClasses>
            <proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>
            <proteinClass source="MDM" id="Md" parent_id="" name="Membrane proteins predicted by MDM"/>
            <proteinClass source="MEMSAT3" id="Me" parent_id="" name="MEMSAT3 predicted membrane proteins"/>
        </proteinClasses>
        <proteinEvidence evidence="Evidence at protein level">
            <evidence source="HPA" evidence="Evidence at transcript level"/>
            <evidence source="MS" evidence="Not available"/>
            <evidence source="UniProt" evidence="Evidence at protein level"/>
        </proteinEvidence>
  </entry> 

出力例:

    <entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000005">
        <name>TNMD</name>
        <synonym>BRICD4</synonym>
        <synonym>ChM1L</synonym>
        <synonym>myodulin</synonym>
        <synonym>TEM</synonym>
        <synonym>tendin</synonym>
        <identifier id="ENSG00000000005" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
            <xref id="Q9H2S6" db="Uniprot/SWISSPROT"/>
            <xref id="64102" db="NCBI GeneID"/>
        </identifier>
        <proteinClasses>
            <proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>
            <proteinClass source="MDM" id="Md" parent_id="" name="Membrane proteins predicted by MDM"/>
            <proteinClass source="MEMSAT3" id="Me" parent_id="" name="MEMSAT3 predicted membrane proteins"/>
        </proteinClasses>
        <proteinEvidence evidence="Evidence at protein level">
            <evidence source="HPA" evidence="Evidence at transcript level"/>
            <evidence source="MS" evidence="Not available"/>
            <evidence source="UniProt" evidence="Evidence at protein level"/>
        </proteinEvidence>
  </entry>  

ベストアンサー1

使用幸せ(以前のPerl_6)

~$ raku -MXML -e 'my $xml = open-xml($*ARGFILES.Str);  \
                  .say for $xml.getElementsByTagName("entry").grep(/ TSPAN6 | TNMD /).pairs;'  file.xml

#OR

~$ raku -MXML -e 'my @xml = open-xml($*ARGFILES.Str).getElementsByTagName("entry");  \
                  my @names = <TSPAN6 TNMD>; .say for @xml.grep(/@names/).pairs;' file.xml

実際のXMLファイルがある場合は、実際のXMLパーサーを使用することをお勧めします。上記のコードでは、XMLコマンドラインフラグを使用してRakuコミュニティモジュールを呼び出します-MXML(この方法はPerlを使用してコマンドラインからモジュールを呼び出すのと同じです)。時間をかけて現在のXMLスキーマに慣れてから、それに応じてコーディングを計画してください。

https://www.Proteinatlas.org/download/ Proteinatlas.xsd

上記の最初の答えは、ファイルを$xmlXML文書として開きます。その後、XML文書はentry名前付き(最上位)要素に分類されます.getElementsByTagName();。最後に、各要素を繰り返して、grep目的の文字列を含む要素を取得します。

上記の2番目の答えは、名前付きXML要素を検索し、entryファイルを@xmlRaku配列として開きます。次に、各要素を繰り返して、grep目的の文字列を含む要素を取得します。この要素は配列に保存されます@names

入力例(@terdonの優れた答えから得られた):

<?xml version="1.0" encoding="UTF-8"?>
<proteinAtlas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://v21.proteinatlas.org/download/proteinatlas.xsd" schemaVersion="2.6">
    <entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000003">
        <name>TSPAN6</name>
        <synonym>T245</synonym>
        <synonym>TM4SF6</synonym>
        <synonym>TSPAN-6</synonym>
        <identifier id="ENSG00000000003" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
            <xref id="O43657" db="Uniprot/SWISSPROT"/>
            <xref id="7105" db="NCBI GeneID"/>
        </identifier>
        <proteinClasses>
            <proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>
            <proteinClass source="Ezkurdia et al 2014" id="Eb" parent_id="" name="Protein evidence (Ezkurdia et al 2014)"/>
        </proteinClasses>
        <proteinEvidence evidence="Evidence at protein level">
            <evidence source="HPA" evidence="Evidence at transcript level"/>
            <evidence source="MS" evidence="Not available"/>
            <evidence source="UniProt" evidence="Evidence at protein level"/>
        </proteinEvidence>
  </entry>
    <entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000005">
        <name>TNMD</name>
        <synonym>BRICD4</synonym>
        <synonym>ChM1L</synonym>
        <synonym>myodulin</synonym>
        <synonym>TEM</synonym>
        <synonym>tendin</synonym>
        <identifier id="ENSG00000000005" db="Ensembl" version="103.38" assembly="GRCh38.p13" gencodeVersion="37">
            <xref id="Q9H2S6" db="Uniprot/SWISSPROT"/>
            <xref id="64102" db="NCBI GeneID"/>
        </identifier>
        <proteinClasses>
            <proteinClass source="MDM" id="Ma" parent_id="" name="Predicted membrane proteins"/>
            <proteinClass source="MDM" id="Md" parent_id="" name="Membrane proteins predicted by MDM"/>
            <proteinClass source="MEMSAT3" id="Me" parent_id="" name="MEMSAT3 predicted membrane proteins"/>
        </proteinClasses>
        <proteinEvidence evidence="Evidence at protein level">
            <evidence source="HPA" evidence="Evidence at transcript level"/>
            <evidence source="MS" evidence="Not available"/>
            <evidence source="UniProt" evidence="Evidence at protein level"/>
        </proteinEvidence>
  </entry>
</proteinAtlas>

出力例:

0 => <entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000003">
        <name>TSPAN6</name>
        <synonym>T245</synonym>
        <synonym>TM4SF6</synonym>
        <synonym>TSPAN-6</synonym>
        <identifier version="103.38" gencodeVersion="37" assembly="GRCh38.p13" db="Ensembl" id="ENSG00000000003">
            <xref id="O43657" db="Uniprot/SWISSPROT"/>
            <xref db="NCBI GeneID" id="7105"/>
        </identifier>
        <proteinClasses>
            <proteinClass id="Ma" source="MDM" parent_id="" name="Predicted membrane proteins"/>
            <proteinClass name="Protein evidence (Ezkurdia et al 2014)" parent_id="" id="Eb" source="Ezkurdia et al 2014"/>
        </proteinClasses>
        <proteinEvidence evidence="Evidence at protein level">
            <evidence source="HPA" evidence="Evidence at transcript level"/>
            <evidence evidence="Not available" source="MS"/>
            <evidence evidence="Evidence at protein level" source="UniProt"/>
        </proteinEvidence>
  </entry>
1 => <entry version="21.1" url="http://v21.proteinatlas.org/ENSG00000000005">
        <name>TNMD</name>
        <synonym>BRICD4</synonym>
        <synonym>ChM1L</synonym>
        <synonym>myodulin</synonym>
        <synonym>TEM</synonym>
        <synonym>tendin</synonym>
        <identifier version="103.38" assembly="GRCh38.p13" db="Ensembl" gencodeVersion="37" id="ENSG00000000005">
            <xref id="Q9H2S6" db="Uniprot/SWISSPROT"/>
            <xref db="NCBI GeneID" id="64102"/>
        </identifier>
        <proteinClasses>
            <proteinClass name="Predicted membrane proteins" source="MDM" id="Ma" parent_id=""/>
            <proteinClass parent_id="" id="Md" name="Membrane proteins predicted by MDM" source="MDM"/>
            <proteinClass id="Me" name="MEMSAT3 predicted membrane proteins" parent_id="" source="MEMSAT3"/>
        </proteinClasses>
        <proteinEvidence evidence="Evidence at protein level">
            <evidence evidence="Evidence at transcript level" source="HPA"/>
            <evidence evidence="Not available" source="MS"/>
            <evidence evidence="Evidence at protein level" source="UniProt"/>
        </proteinEvidence>
  </entry>

上記の呼び出しはpairs出力要素に番号を付けます。最後に、@terdonのコメントは、grep遺伝子名が最も安全な方法ではない可能性があることを正確に指摘しています。代わりにsを検索すると、Id戻り値を大幅に簡素化できます(実際に返される制限付きサブセットが役に立つ場合)。

~$ raku -MXML -e 'my $xml=open-xml($*ARGFILES.Str); put $xml.getElementById("ENSG00000000003"|"ENSG00000000005").pairs;' file.xml

返品:

0   <identifier version="103.38" gencodeVersion="37" id="ENSG00000000003" db="Ensembl" assembly="GRCh38.p13">
            <xref id="O43657" db="Uniprot/SWISSPROT"/>
            <xref id="7105" db="NCBI GeneID"/>
        </identifier>
0   <identifier gencodeVersion="37" assembly="GRCh38.p13" version="103.38" db="Ensembl" id="ENSG00000000005">
            <xref db="Uniprot/SWISSPROT" id="Q9H2S6"/>
            <xref db="NCBI GeneID" id="64102"/>
        </identifier>

https://github.com/raku-community-modules/XML
https://rakudo.org/
https://raku.org

おすすめ記事