コマンドライン:grepを使用して行の一部のみを取得します。

コマンドライン:grepを使用して行の一部のみを取得します。

次の行を含むファイルがあります。

1   train   tree    11869   12227   .   +   .   leaf_id "ENSG00000223972"; root_id "ENST00000456328";

私が検索する行はtrain2番目とtree3番目の列になければなりません。

leaf_id引用符で始まるコンテンツだけをインポートしたいと思います。残りの行は関係ありません。私は正規表現を使ってグループをキャプチャしようとしましたが、成功しませんでした。ABC

スペースではなくスペースで列を区切ってください\t。最後のフィールドは、leaf_id "ENSG00000223972"; root_id "ENST00000456328";項目がタブではなく空白で区切られたフィールドです。

ありがとう

答え1

文字列と文字列が2番目と3番目のフィールドにそれぞれ表示され、他の場所に表示されない限り、grep実際にGNUを使用してこれを実行できます。treetrain

$ grep -oP 'train\ttree\t.*leaf_id "\K[^"]+' file
ENSG00000223972

makeは行内の一致する部分-oのみを印刷し、Perl準拠の正規表現を有効にしておよびを提供します。grep-P+\K

正規表現は、traina \t\treeanother \t、それから何かが見つかるまで検索しますleaf_id "。それから今まで一致させてきたすべてを忘れてしまってください\Kgrepしたがって、今、私たちはこの後に最も長い非文字セグメントを探します"。これがあなたが探している遺伝子名になります。


一致treeし、train正しい列にしかない場合は、次のようにします。

$ awk -F'\t' '$2=="train" && $3=="tree"' file | grep -oP 'leaf_id "\K[^"]+'
ENSG00000223972

または:

$ perl -F'\t' -lane 'if($F[1] eq "train" && $F[2] eq "tree" && $F[8]=~/leaf_id\s+"\K([^"]+)/){print $1}' file
ENSG00000223972

答え2

awkこれに使用できます。ファイルが呼び出されたと仮定すると、関連するinput.tsvコマンドは次のようになります。

awk -F"\t" '$2=="train" && $3=="tree" {split($9,f,"\""); print f[2]}' input.tsv

-F"\t"これにより、各タブ()の行が別々のフィールドに分割されます。 2番目のフィールドがあり、3番目のフィールドがあるtrain場合、9番目のフィールドがtreeチェックされ、二重引用符内の文字列が印刷されます。

後者は以下を使用して(間違って)達成されますsplit()。フィールドは各二重引用符に分割され、すべての部分は配列変数に格納されますf。 2番目の項目f[2]awk配列通常1)で始まるものは引用符内の文字列であり、印刷されます(最初の項目fleaf_id、3番目の項目は; root_idなど)。

答え3

sedを使用してください:

$ sed -nE 's/^.*train.*tree.*leaf_id "([A-Z][A-Z0-9]*)";.*$/\1/p' file
ENSG00000223972

関連情報