次の行を含むファイルがあります。
1 train tree 11869 12227 . + . leaf_id "ENSG00000223972"; root_id "ENST00000456328";
私が検索する行はtrain
2番目とtree
3番目の列になければなりません。
leaf_id
引用符で始まるコンテンツだけをインポートしたいと思います。残りの行は関係ありません。私は正規表現を使ってグループをキャプチャしようとしましたが、成功しませんでした。ABC
スペースではなくスペースで列を区切ってください\t
。最後のフィールドは、leaf_id "ENSG00000223972"; root_id "ENST00000456328";
項目がタブではなく空白で区切られたフィールドです。
ありがとう
ベストアンサー1
文字列と文字列が2番目と3番目のフィールドにそれぞれ表示され、他の場所に表示されない限り、grep
実際にGNUを使用してこれを実行できます。tree
train
$ grep -oP 'train\ttree\t.*leaf_id "\K[^"]+' file
ENSG00000223972
makeは行内の一致する部分-o
のみを印刷し、Perl準拠の正規表現を有効にしておよびを提供します。grep
-P
+
\K
正規表現は、train
a \t
、\tree
another \t
、それから何かが見つかるまで検索しますleaf_id "
。それから今まで一致させてきたすべてを忘れてしまってください\K
。grep
したがって、今、私たちはこの後に最も長い非文字セグメントを探します"
。これがあなたが探している遺伝子名になります。
一致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