次のファイルがあります。
A1-1915435_1_MIMAT0000069_MirBase_miR-16_microRNA_1_22-A1-1915435_1_ENSG00000206737_ENST00000384010_U1_snRNA_73_115
A1-2362643_1_MIMAT0000732_MirBase_miR-378_microRNA_1_21-A1-2362643_1_ENSG00000222328_ENST00000410396_U2_snRNA_168_211
マイクロRNAセクションとENSGセクションの別々のタブを持つ出力が必要です。このような:
miR-16_microRNA ENSG00000206737
miR-378_microRNA ENSG00000222328
Perlスクリプトを書くことはできますが、awk、sed Perlなどを使用するコマンドラインソリューションが必要です。
答え1
perl -pe 's!.*(miR-\d+_microRNA).*(ENSG\d+).*!$1\t$2!'
説明する?
もちろんです。申し訳ありません。
- 各行について (perl -p)
- 正規表現を
$1 tab $2
whereに置き換える$1
$2
キャプチャグループの逆参照として番号が付けられます(...)
。ほとんどすべての最新の正規表現エンジンがこれをサポートします。
- 正規表現情報:
.
= を除くすべての文字\n
.*
=文字シーケンス(代替では無視)\d
=数字(と同じ[0-9]
)\d+
= 1つ以上\d
何でも見てくださいreg式チュートリアルより詳細な説明が必要です。
答え2
使用sed
:
sed 's/^.*\(miR-[0-9]*_microRNA\).*\(ENSG[0-9]*\).*$/\1\t\2/' <infile
答え3
使用アッ形式が信頼できると仮定します。
$ awk -F'_' '{print $5"_"$6, $11}' file
miR-16_microRNA ENSG00000206737
miR-378_microRNA ENSG00000222328
答え4
sed -n 'y/_E/\t\n/;s/\n/E/;s/[^m]*//;s/\(A.\).*E/\1E/;P'
あなたの例を考えると、これは私にとって効果的でした...
miR-16 microRNA ENSG00000206737
miR-378 microRNA ENSG00000222328
\t
最初のabをもう一度aに変換するにはbeforeを追加_
できますが、この方法が良く見えると思います。s/\t/_/
P
他の方法は次のとおりです。
sed 's/RNA[^E]*_/RNA\t/;s/[^m]*//;s/_E.*//'
...または...
sed 's/[^mE]*\([mE][^mE_]*\)/\1/;s//\t\1/3;s/_E.*//'
...両方とも、目的の出力に表示される内容を印刷します。
miR-16_microRNA ENSG00000206737
miR-378_microRNA ENSG00000222328
。いずれにせよ、\t
実装によっては、エスケープ文字の代わりにリテラル文字を使用する必要がありますsed
。