我需要从我的 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//'
但是它们不起作用……有什么建议吗? 谢谢!
用3个空格替换它。
sed 's/^chr/ /' your.vcf > no_chr.vcf
使用
sed
$ sed -E '/^#/! {:a;s/[a-z]([0-9])?/ \1/;ta}' input_file
#CHROM POS
1 10570
1 10574
1 10654
使用这个 Perl 单行代码:
perl -i.bak -pe 's/^chr//' your.vcf
Perl 单行代码使用这些命令行标志:
-e
:告诉 Perl 查找内联代码,而不是在文件中。-p
:一次循环输入一行,默认情况下将其分配给$_
。在每次循环迭代后添加print $_
。-i.bak
:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在其名称后附加扩展名 .bak
来保存原始文件的备份副本。如果你想跳过写备份文件,只需使用-i
并跳过扩展名。
s/^chr//
:用空字符串替换字符串开头的chr
(此处为行)。无需使用 g
修饰符,因为每行只有一个替换项。
另见:
perldoc perlrun
:如何执行Perl解释器:命令行开关perldoc perlre
:Perl正则表达式(regexes)perldoc perlrequick
:Perl正则表达式快速入门带有输入和输出的完整示例:
创建测试输入:
cat > your.vcf <<EOF
#CHROM POS
chr1 10570
chr1 10574
chr1 10654
EOF
使用
cat
和hexdump
确认没有特殊字符:
cat your.vcf
印花:
#CHROM POS
chr1 10570
chr1 10574
chr1 10654
hexdump -C your.vcf
印花:
00000000 23 43 48 52 4f 4d 20 20 50 4f 53 20 20 0a 63 68 |#CHROM POS .ch|
00000010 72 31 20 20 20 31 30 35 37 30 0a 63 68 72 31 20 |r1 10570.chr1 |
00000020 20 20 31 30 35 37 34 0a 63 68 72 31 20 20 20 31 | 10574.chr1 1|
00000030 30 36 35 34 0a |0654.|
00000035
删除
chr
:
perl -i.bak -pe 's/^chr//' your.vcf
查看文件:
cat your.vcf
印花:
#CHROM POS
1 10570
1 10574
1 10654