求助:如何用sed将GTF文件的locus_tag替换为带引号的transcript_id
用sed将GTF文件中的locus_tag替换为transcript_id
问题场景
将NCBI GFF3格式转成Cell Ranger ARC mkref 所需的GTF格式时,gffread和agat工具生成的文件缺失transcript_id字段,但文件中存在locus_tag属性。需要将格式如; locus_tag AbcdE_f1 ;的内容替换为; transcript_id "AbcdE_f1" ;(含引号),同时兼容行尾无分号的locus_tag场景。
原命令无效原因
你之前执行的命令sed -i.bak "s/locus_tag\([0-9a-zA-Z ,._-]{1,}\);/transcript_id \"1\";/g" myFile.gtf没有效果,问题出在:
- 未启用扩展正则表达式:
{1,}属于扩展正则语法,默认sed使用基础正则,需显式开启 - 捕获组引用错误:应该用
\1引用捕获的内容,而非\"1\" - 未匹配
locus_tag后的空格,且未处理行尾无分号的locus_tag
正确的sed命令
GNU sed(Linux环境)
sed -i.bak -E 's/locus_tag ([^;]+)(;|$)/transcript_id "\1"\2/g' myFile.gtf
BSD sed(macOS环境)
BSD sed的-i选项需要显式指定备份格式,命令为:
sed -i '' -E 's/locus_tag ([^;]+)(;|$)/transcript_id "\1"\2/g' myFile.gtf
命令说明
-E:启用扩展正则表达式,无需对+、()等符号转义- 正则匹配逻辑:
locus_tag:精准匹配locus_tag及后续的空格([^;]+):捕获locus_tag后的标签内容(直到分号或行尾),避免误匹配包含空格的其他字段(;|$):匹配后续的分号或行尾,保留原格式的结尾结构
- 替换规则
transcript_id "\1"\2:将捕获的标签内容用引号包裹,同时保留原有的分号或行尾
验证示例
输入
ChrPT RefSeq exon 956 981 . + . Dbxref "GeneID:38831453" ; ID "nbis-exon-1" ; Parent PhpapaC_p1 ; gbkey exon ; gene "3' rps12" ; locus_tag PhpapaC_p1 ; product "ribosomal protein S12" <br> ChrPT RefSeq gene 1033 1500 . + . Dbxref "GeneID:2546745" ; ID "nbis-gene-17" ; Name rps7 ; gbkey Gene ; gene rps7 ; gene_biotype protein_coding ; locus_tag PhpapaCp002
输出
ChrPT RefSeq exon 956 981 . + . Dbxref "GeneID:38831453" ; ID "nbis-exon-1" ; Parent PhpapaC_p1 ; gbkey exon ; gene "3' rps12" ; transcript_id "PhpapaC_p1" ; product "ribosomal protein S12" <br> ChrPT RefSeq gene 1033 1500 . + . Dbxref "GeneID:2546745" ; ID "nbis-gene-17" ; Name rps7 ; gbkey Gene ; gene rps7 ; gene_biotype protein_coding ; transcript_id "PhpapaCp002"
内容的提问来源于stack exchange,提问作者rdv
相关产品推荐
相关产品推荐

