
同様の質問がありますが、私が経験している問題を完全に解決することはありません。
簡単に言えば、探している文字列を含むすべてのブロックを印刷する必要があります。各ブロックの開始行には次のものが含まれます。 <アイテムバージョン=
詳しくは下記をご覧ください。
パターン領域(ブロック)内で特定の文字列が認識されたら、パターン間の領域全体(ブロック)を印刷する大容量ファイル(数十万行)を検索したいと思います。
以下を使用して、パターン間の領域全体を印刷できることを知っています。ここで、これらのブロックの始まりと終わりの識別子は「/<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
上記の最初の答えは、ファイルを$xml
XML文書として開きます。その後、XML文書はentry
名前付き(最上位)要素に分類されます.getElementsByTagName();
。最後に、各要素を繰り返して、grep
目的の文字列を含む要素を取得します。
上記の2番目の答えは、名前付きXML要素を検索し、entry
ファイルを@xml
Raku配列として開きます。次に、各要素を繰り返して、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
答え2
入力が正しい形式のXML文書であるとします(例:テドンの答えただし、質問に表示されているものではありません)特定および属性を使用して各ノードのコピーを印刷するために使用できますxmlstarlet
。entry
name
proteinClass
source
xmlstarlet select --template \
--copy-of '//entry[name = "TNMD" and proteinClasses/proteinClass/@source = "MEMSAT3"]' \
-nl file
entry
これにより、特定の属性値を持つ子ノードを持つname
特定proteinClasses/proteinClass
の属性値を持つすべてのノードが選択されますsource
。entry
一致する各ノードのコピーが末尾の改行文字とともに出力されます。
答え3
レコード区切り文字を使用してGNU awkでこれを実行できます</entry[^>]*>
。たとえば、次のファイルを入力として使用します。
<?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>
次の方法でデータを取得できますTNMD
。
$ gawk 'BEGIN{ RS="</entry[^>]*>" } /TNMD/' a
<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>
これは、「一致する場合はこの行を印刷しますTNMD
」を意味します。もちろん、ラインがこのような場合は印刷され、87% identity to TNMD
正しいパーサーを使用していないため、さまざまな極端なケースで明らかに壊れます。
適切なパーサーを使用すると、文字列が必要な場所を正確に指定できます。