如何使用grep提取含特殊字符的GTF文件中的gene_id字段
问题原因
你之前的命令无法得到预期结果主要有两点问题:
- sed 默认正则规则中
!不代表匹配取反,你编写的替换规则没有定位到gene_id对应的字段,不会对原文件内容产生任何修改效果 - 没有处理属性字段中存在的反引号、双引号特殊字符,也没有设计精准提取目标内容的逻辑
解决方案
以下几种方案都可以直接实现你的需求,运行后输出的内容和你预期的完全一致:
方案1:awk 实现(最稳定,适配标准GTF格式)
awk -F 'gene_id "' '{split($2,a,"\""); print a[1]}' file.gtf > myfile.txt
逻辑说明:以 gene_id " 作为分隔符拆分每行,拆分后的第二部分开头即为目标 gene_id 内容,再用双引号拆分第二部分取第一个元素,自动兼容行内多余的反引号,无需额外处理其他字段。
方案2:sed 实现(分组匹配提取)
sed -n 's/.*gene_id [`"]*\([^"]*\)".*/\1/p' file.gtf > myfile.txt
逻辑说明:正则匹配整行内容,定位到 gene_id 后面可选的反引号、双引号,将双引号之前的目标内容放入分组1,最终只输出分组1的内容。
方案3:grep 实现(需支持PCRE正则)
grep -oP 'gene_id [`"]*\K[^"]+' file.gtf > myfile.txt
逻辑说明:-P 参数启用PCRE正则规则,\K 会丢弃之前匹配到的 gene_id 及后面的反引号/双引号内容,只输出后续到双引号之前的目标值。
内容的提问来源于stack exchange,提问作者Jasmin Jonson
相关产品推荐
相关产品推荐

