使用 awk 更改 vcf 文件中的 ID 字符串

Change ID string in vcf file with awk

我有一个带有如下 SNP ID 的 VCF 文件:

AX-14233402__rs35404821
AX-37499887__rs74704183
AX-36783275__rs11997571

我想将 SNP ID 更改为只有没有 AX-... 项的 ID:

rs35404821 
rs74704183 
rs74704183

有什么解决办法吗?我尝试使用 gsub 命令,但没有任何改变:

awk '{gsub(/AX*_rs/,"rs"); print}' datafile.vcf > datafile_ID.vcf

这里,*用作量词,而不是任何文本模式。

您可以使用 .* 来匹配 AX 和最右边的 _rs 之间的任何文本(因为它是您内容中唯一的 _rs,所以可以使用):

awk '{gsub(/AX.*_rs/,"rs")}1' datafile.vcf > datafile_ID.vcf

注意 print 替换为 1,这会导致默认的 print 操作。

online demo:

#!/bin/bash
s='AX-14233402__rs35404821
AX-37499887__rs74704183
AX-36783275__rs11997571'
awk '{gsub(/AX.*_rs/,"rs")}1' <<< "$s"

输出:

rs35404821
rs74704183
rs11997571

使用您展示的示例,请尝试以下解决方案。这段代码的作用是:将 __ 设置为所有行的字段分隔符,然后检查行是否从 AX- 开始的条件,然后打印该行的第二个字段。

awk -F'__' '/^AX-/{print }' Input_file

OR 如果您想在 __ 之后打印值而不检查行是否从 [=13= 开始] 或不然后尝试跟随。

awk -F'__' '{print }'  Input_file
$ cut -d_ -f3 file
rs35404821
rs74704183
rs11997571

如果这不是您需要的全部内容,请编辑您的问题以包含更具代表性的样本input/output,包括不适用的案例。

如果AX-后的位数是固定的,则用substr得到第14个及以后的元素。让file.txt内容为

AX-14233402__rs35404821
AX-37499887__rs74704183
AX-36783275__rs11997571

然后

awk '{print substr([=11=],14)}' file.txt

输出

rs35404821
rs74704183
rs11997571

解释:我使用 substr 函数和 print 它得到从第 14 个字符到结尾的行的子字符串。

(在 gawk 4.2.1 中测试)

如果您不使用 sed,用 awk 简单替换:

awk 'sub(/^.*__/,"")' file
rs35404821
rs74704183
rs11997571

您在星号前少了一个点,因此 AX* 将匹配一个 A 字符和零次或多次 X 字符。

使用 gnu awk 您还可以获得 SNP ID 的精确匹配和 use/print rs 部分的捕获组,仅后跟数字:

awk 'match([=10=], /AX-[0-9]+__(rs[0-9]+)/, a) {print a[1]}' datafile.vcf > datafile_ID.vcf

或者使用 sub,因为似乎只有一个替换。您不必使用 print 因为 sub returns 替换次数(0 或 1)

awk 'sub(/^AX-[0-9]+__rs/,"rs")' datafile.vcf > datafile_ID.vcf

文件“datafile_ID.vcf”中的内容:

rs35404821
rs74704183
rs11997571