我有一个这样的文件:
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 $2
where$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假设格式可靠:
$ 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_
那么你可以在 -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
实现。