通过 AWK 为指定列(VCF 文件)的值添加前缀

Add a prefix to values of specified column (of VCF file) by AWK

我正在处理包含大量列的制表符分隔文件(VCF 文件 enter link description here)(下面是一个小示例)

1 13979 S01_13979 C G . . PR GT ./. ./.
1 13980 S01_13980 G A . . PR GT ./. ./.
1 13986 S01_13986 G A . . PR GT ./. ./.
1 14023 S01_14023 G A . . PR GT 0/0 ./.
1 15671 S01_15671 A T . . PR GT 0/0 0/0
1 60519 S01_60519 A G . . PR GT 0/0 0/0
1 60531 S01_60531 T C . . PR GT 0/0 0/0
1 63378 S01_63378 A G . . PR GT 1/1 ./.
1 96934 S01_96934 C T . . PR GT 0/0 0/0
1 96938 S01_96938 C T . . PR GT 0/0 0/0

在第一列(染色体名称)中,我有从 1 到 26 的数字(例如 1,2,...25,26)。我想为 1 到 9 的数字添加 HanXRQChr0 前缀,为 10 到 26 的数字添加 HanXRQChr 前缀。所有其他列中的值应保持不变。 现在我尝试了 sed 解决方案,但输出不完全正确(最后一个管道不起作用):

cat test.vcf | sed -r '/^[1-9]/ s/^[1-9]/HanXRQChr0&/' | sed -r '/^[1-9]/ s/^[0-9]{2}/HanXRQChr&/' > test-1.vcf

AWK 如何做到这一点?我认为在我的情况下使用 AWK 会更安全,直接更改文件的第一列。

由于您没有提供示例输入,这里是一个包含模拟数据的脚本

$ seq 1 3 30 | awk '1<= && <=26 {=sprintf("HanXRQChr%02d",)}1'
HanXRQChr01
HanXRQChr04
HanXRQChr07
HanXRQChr10
HanXRQChr13
HanXRQChr16
HanXRQChr19
HanXRQChr22
HanXRQChr25
28

请注意,28 转义了前缀逻辑。

要防止制表符分隔符转换为空格,请将 BEGIN 块添加到开头

$ awk 'BEGIN{FS=OFS="\t"} ...

能否请您尝试关注。

awk -v first="HanXRQChr0" -v second="HanXRQChr" '
>=1 && <=9{
  =first 
}
>=10 && <=26{
  =second 
}
1' Input_file

您也可以根据需要更改名为 first 的变量和 second 的值。它会做什么它将检查第一个字段的值是否从 1 到 9 它将在变量 second 值前加上前缀,如果第一个字段的值是从 10 到 26 它将在其中添加 first 变量值前缀.

说明: 上面的代码也在这里添加说明。

awk -v first="HanXRQChr0" -v second="HanXRQChr" '  ##Creating variable named first and second and you could keep their values as per your need.
>=1 && <=9{                                        ##Checking condition when first field is greater than or equal to 1 and less than or equal to 9 here then do following.
  =first                                           ##Re-creating the first field and adding variable first value before it here.
}                                                      ##closing this condition block here.
>=10 && <=26{                                      ##Checking condition here if 1st field is greater than or equal to 10 AND lesser than or equal to 26 then do following.
  =second                                          ##Re-creating first field value and adding variable second value before  here.
}                                                      ##Closing this condition block here.
1                                                      ##Mentioning 1 will be printing the line here.
' Input_file                                           ##Mentioning Input_file name here.