【问题标题】:Add a prefix to values of specified column (of VCF file) by AWK通过 AWK 为指定列(VCF 文件)的值添加前缀
【发布时间】:2018-08-21 18:28:47
【问题描述】:

我正在使用包含大量列的制表符分隔文件(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 前缀。所有其他列中的值应保持不变。 现在我尝试了sedsolution,但输出并不完全正确(最后一个管道不起作用):

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 在我的情况下使用会更安全,直接更改文件的第一列。

【问题讨论】:

  • 请在输入和输出的代码标签中添加示例,也请尝试添加您为解决此问题所做的努力,然后让我们知道。
  • 虽然它可以在 awk 中完成,但作为一般规则,如果你问“我如何进入 (awk | sh)”,答案是“不要,使用 perl”。如果不清楚如何做,awk 或 sh 是错误的工具。

标签: awk vcf-variant-call-format


【解决方案1】:

请您尝试关注一下。

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

您也可以根据需要更改名为firstsecond 的变量的值。它将检查第一个字段的值是否从 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>=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.

【讨论】:

  • 谢谢!我只是在学习AWK,所以让我问几个问题? 1)我想知道最后一个报价之前的 1 个数字的功能? 2)您的代码示例替换命令在哪里?我认为我需要一个 sub 命令来完成此操作
  • @Denis,在这种情况下实际上不需要替换,一个简单的连接就可以了,给我几分钟时间在这里添加解释以便更好地理解。
  • 另外,为什么我在-F 标志之后需要一个逗号,而在-v 标志之后什么都不需要?
  • @Denis,很抱歉您实际上不需要 -F"," 的东西,以为您的 Input_file 是逗号分隔的,现在删除它们,然后检查并告诉我?
  • 它有效,但我必须添加 `BEGIN{OFS="\t"} 以保留 karakfa 建议的原始文件格式。
【解决方案2】:

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

$ 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

注意 28 转义了前缀逻辑。

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

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

【讨论】:

    猜你喜欢
    • 2020-03-27
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多