みんな。<Interaction>
ファイルから定義した値のリストによって定義されたいくつかのノードのみを保持するために、(BLAST から) 大きな xml ファイルをフィルター処理しようとして<Iteration_iter-num>
います。簡単な例を次に示します (実際の Blast.xml には 80000 回を超える繰り返しがあります)。
<?xml version="1.0"?>
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">
<BlastOutput>
<BlastOutput_program>blastx</BlastOutput_program>
<BlastOutput_iterations>
<Iteration>
<Iteration_iter-num>3037</Iteration_iter-num>
<Iteration_query-ID>Query_3037</Iteration_query-ID>
</Iteration>
<Iteration>
<Iteration_iter-num>5673</Iteration_iter-num>
<Iteration_query-ID>Query_5673</Iteration_query-ID>
</Iteration>
<Iteration>
<Iteration_iter-num>11397</Iteration_iter-num>
<Iteration_query-ID>Query_11397</Iteration_query-ID>
</Iteration>
<Iteration>
<Iteration_iter-num>15739</Iteration_iter-num>
<Iteration_query-ID>Query_15739</Iteration_query-ID>
</Iteration>
</BlastOutput_iterations>
</BlastOutput>
そして、保持する反復を含むファイルがあります(keep_iterとして保存されます):
5673
11397
この種の低規模の問題については、xmlstarlet を使用してフィルタリングを実行し、最初に比較用の文字列を格納するファイルのバージョンを作成しました (フィルターとして保存されます)。
Iteration_iter-num!=5673 and Iteration_iter-num!=11397
これは、以下のチャームとして機能します。
cat Blast.xml | xmlstarlet ed -d "/BlastOutput/BlastOutput_iterations/Iteration[`cat filter`]" > finalBlast.xml
基本的に、フィルタ ファイルに含まれていないすべての反復ノードを削除しました。
<?xml version="1.0"?>
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">
<BlastOutput>
<BlastOutput_program>blastx</BlastOutput_program>
<BlastOutput_iterations>
<Iteration>
<Iteration_iter-num>5673</Iteration_iter-num>
<Iteration_query-ID>Query_5673</Iteration_query-ID>
</Iteration>
<Iteration>
<Iteration_iter-num>11397</Iteration_iter-num>
<Iteration_query-ID>Query_11397</Iteration_query-ID>
</Iteration>
</BlastOutput_iterations>
</BlastOutput>
問題は、フィルターする 20000 の値を持つ keep_iter ファイルが実際にあることです。フィルタ ファイルを作成して上記の xmlstarlet コマンドを実行すると、明らかに引数が長すぎます。
このような Blast.xml ファイルをフィルタリングして、keep_iter ファイルにリストされている反復番号 (20k の値) の反復ノードのみを保持するための提案はありますか? 元のxml構造を維持したい。