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

如何使用Bash移除VCF文件中的chr前缀?

问题:移除VCF文件中的'chr'前缀

原始VCF文件片段:

#CHROM  POS  
chr1   10570
chr1   10574
chr1   10654

期望输出结果:

#CHROM  POS  
   1   10570
   1   10574
   1   10654

已尝试但无效的命令:

awk '{gsub(/^chr/,""); print}' your.vcf > no_chr.vcf
sed 's/^chr//'
sed 's:chr::g'
awk '{gsub(/\chr/, "")}1'
perl -pe  's/^chr//g'
sed '/^##/! s/chr//'

可行解决方案

方案1:处理带前导空格的场景

从期望结果看,数据行的1前有空格,说明原始数据行的chr1前可能存在前导空白字符,之前的命令用^chr匹配行首的chr自然失效。可以用以下命令解决:

  • sed命令:
sed 's/\s*chr//' your.vcf > no_chr.vcf

\s*会匹配0个或多个空白字符(空格/制表符),随后替换掉紧跟的chr,保留原有空白和染色体编号。

  • awk命令:
awk '{gsub(/chr/, "", $1); print}' your.vcf > no_chr.vcf

直接针对第一列(#CHROM列)操作,不管列前有没有空白,只清除该列内的chr前缀。

方案2:仅处理数据行,保留标题行

如果需要保留#CHROM标题行不修改,只处理非注释的数据行:

awk '!/^#/ {gsub(/chr/, "", $1)} 1' your.vcf > no_chr.vcf

!/^#/匹配所有不以#开头的数据行,仅对这些行的第一列清除chr;1表示打印所有行(包括标题行和注释行)。

方案3:兼容VCF元信息行

如果VCF文件包含大量##开头的元信息行,需要保留这些行,仅修改#CHROM之后的数据行:

sed '/^##/! s/\(^\s*\)chr/\1/' your.vcf > no_chr.vcf

/^##/!表示跳过所有##开头的元信息行;\(^\s*\)捕获行首的空白字符,替换时保留这些空白,只移除chr前缀。

内容的提问来源于stack exchange,提问作者Khaleesi95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:26:59