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

通过AWK向(VCF文件的)指定列的值添加前缀,awk,vcf-variant-call-format,Awk,Vcf Variant Call Format,我正在使用带有大量列的制表符分隔文件(VCF文件)(下面是一个小示例) 在第1列(染色体名称)中,我有从1到26的数字(例如1,2,…25,26)。我想在1到9的数字中添加HanXRQChr0前缀,在10到26的数字中添加HanXRQChr0前缀。所有其他列中的值应保持不变。 目前,我尝试了一个sed解决方案,但输出不完全正确(最后一个管道不工作): 如何通过AWK实现这一点?我认为在我的情况下使用AWK会更安全,只直接更改文件的第1列。由于您没有提供示例输入,下面是一个包含模拟数据的脚本 $

我正在使用带有大量列的制表符分隔文件(VCF文件)(下面是一个小示例)

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


如何通过AWK实现这一点?我认为在我的情况下使用
AWK
会更安全,只直接更改文件的第1列。

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

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

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

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

你能试试下面的吗

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

你能试试下面的吗

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

请在输入和输出的代码标签中添加示例,也请尝试添加您为解决此问题所付出的努力,然后让我们知道。虽然可以在Awk中完成,但作为一般规则,如果您问“如何在(Awk | sh)中使用I”,答案是“不要,使用perl”。如果不清楚如何做,awk或sh是错误的工具。请在输入和输出的代码标签中添加示例,也尝试添加您为解决此问题所付出的努力,然后让我们知道。虽然可以在awk中完成,但作为一般规则,如果您问“如何在(awk | sh)中使用I”,答案是“不要,使用perl”。如果不清楚怎么做,awk或sh是错误的工具。谢谢!我只是在学习AWK,所以让我问几个问题好吗?1) 我想知道在最后一个引号之前1的函数是什么?2) 代码示例替换命令的位置在哪里?我想我需要一个
sub
命令that@Denis,在这种情况下不需要替换实际上,一个简单的连接就可以了,给我几分钟的时间在这里添加解释以便更好地理解。此外,为什么我在
-F
标志后需要逗号,而在
-v
标志后不需要逗号?@Denis,抱歉,您不需要使用
-F“,”
事实上,虽然您的输入文件是用逗号分隔的,但现在已将它们删除,请检查并让我知道?它可以工作,但我必须添加“BEGIN{OFS=“\t”}以保留karakfa建议的原始文件格式。谢谢!我只是在学习AWK,所以让我问几个问题好吗?1) 我想知道在最后一个引号之前1的函数是什么?2) 代码示例替换命令的位置在哪里?我想我需要一个
sub
命令that@Denis,在这种情况下不需要替换实际上,一个简单的连接就可以了,给我几分钟的时间在这里添加解释以便更好地理解。此外,为什么我在
-F
标志后需要逗号,而在
-v
标志后不需要逗号?@Denis,抱歉,您不需要使用
-F“,”
事实上,虽然您的输入文件是用逗号分隔的,但现在已将它们删除,请检查并让我知道?它可以工作,但我必须添加`BEGIN{OFS=“\t”}以保留karakfa建议的原始文件格式。
awk -v first="HanXRQChr0" -v second="HanXRQChr" '
$1>=1 && $1<=9{
  $1=first $1
}
$1>=10 && $1<=26{
  $1=second $1
}
1' Input_file
awk -v first="HanXRQChr0" -v second="HanXRQChr" '  ##Creating variable named first and second and you could keep their values as per your need.
$1>=1 && $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.
  $1=first $1                                          ##Re-creating the first field and adding variable first value before it here.
}                                                      ##closing this condition block here.
$1>=10 && $1<=26{                                      ##Checking condition here if 1st field is greater than or equal to 10 AND lesser than or equal to 26 then do following.
  $1=second $1                                         ##Re-creating first field value and adding variable second value before $1 here.
}                                                      ##Closing this condition block here.
1                                                      ##Mentioning 1 will be printing the line here.
' Input_file                                           ##Mentioning Input_file name here.