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

我想要一个输出,其中我将 micro 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+= 一个或多个\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

如果你想将第一个\tab 转换回 a_那么你可以在 -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实现。

相关内容