コマンドライン: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

おすすめ記事