使用 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
操作。
#!/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
我有一个带有如下 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
操作。
#!/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