Unixのパターンマッチングとキャプチャ

Unixのパターンマッチングとキャプチャ

次のファイルがあります。

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 $2whereに置き換える
    • $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

関連情報