You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:15:31