次の行を含むファイルがあります。
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
答え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)で始まるものは引用符内の文字列であり、印刷されます(最初の項目f
はleaf_id
、3番目の項目は; root_id
など)。
答え3
sedを使用してください:
$ sed -nE 's/^.*train.*tree.*leaf_id "([A-Z][A-Z0-9]*)";.*$/\1/p' file
ENSG00000223972