ある単語のすべての行を別の単語に抽出し、それらの間に一致するものを追加します。

ある単語のすべての行を別の単語に抽出し、それらの間に一致するものを追加します。

次の構造のファイルがあります。

[Term]
id: GO:0000001
name: mitochondrion inheritance
namespace: biological_process
def: "The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by interactions between mitochondria and the cytoskeleton." [GOC:mcc, PMID:10873824, PMID:11389764]
synonym: "mitochondrial inheritance" EXACT []
is_a: GO:0048308 ! organelle inheritance
is_a: GO:0048311 ! mitochondrion distribution

この構造は辞書のように何度も繰り返される。各定義は空の改行で始まり、[Term]後続の定義と区別されます。すべての定義がで始まる行で終わるわけではありませんis_a。いくつかの用語をgrepして全体の定義を検索したいので、[Term]null改行、つまり以前に示された構造例が結果になる可能性がありますgrep -i "mitochondria" myfile。どうすればいいですか?定義ごとの行数は固定されておらず、定義のどの時点でも一致できます。

これが適切なツールかどうかはわかりませんgrep。問題は、いくつかの単語を一度に一致させたかったので、使い始めたということですgrep -i -e "match" -e "someothermatch"regex

私はWindows環境でCygwinを使用しており、明らかにPCREをサポートしています。

ベストアンサー1

あなたの説明によると(強調):

[*Term*]すべての定義は and で始まります。
空白の改行で、以下と区別されます。

null RS( ) を使用して awk を呼び出すと、RS=''ファイルは空行に分割されます。
文字列に基づいて選択することもできます。

$ var="someothermatch"
$ awk -v RS='' -v var="$var" '$0~var{print}' infile

得るために努力しなければならない全体の段落そのゲーム。

awkマニュアルから:

RS が空文字列に設定されている場合、レコードは空行で区切られます。 RSが空の文字列に設定されている場合、改行文字はFSが持つことができる値に加えて常にフィールド区切り文字として機能します。

おすすめ記事