编辑 ID 列以将 chr 添加到数字

edit the ID column to add chr to a number

我有一个 vcf 文件。 它看起来像这样: 它有一个 vcf header 后跟基因型信息。 我想将 chr 添加到第三列。 就像现在它看起来像:

21 9825796 21_9825796_C_T_b37

我想在第三列前面加chr 所以现在它应该看起来像:

21 9825796 chr21_9825796_C_T_b37

我使用了这个命令:

awk '{if([=12=] !~ /^#/) print "chr"; else print }' chr21_annotate.vcf > chr21_annotate_38_impute.vcf

但我无法获得所需的输出。 谁能帮忙

mawk '/^[^#]/*sub(/^/,"chr",)' test.vcf

# comment 1 
21 9825796 21_9825796_C_T_b37
43 82852851 43_82852851_C_T_b37

===before ^ ========after v ========

21 9825796 chr21_9825796_C_T_b37
43 82852851 chr43_82852851_C_T_b37

如果你想尝试奇特的语法,那么

mawk '+(="chr")</^[^#]/'           

# comment 1 
21 9825796 21_9825796_C_T_b37
43 82852851 43_82852851_C_T_b37

===before ^ ========after v ========

21 9825796 chr21_9825796_C_T_b37
43 82852851 chr43_82852851_C_T_b37

假设您确实在输入的某处确实有以 # 开头的行,您不想更改(根据您的代码)并且您不想更改白色 space 在字段之间(根据您发布的图片)并且您想要稳健地执行它,因此即使早期的字段可能包含与 $3 相同的字符串并且您想要便携地执行它,它也可以工作...这将使用任何方式执行您想要的操作POSIX sed(针对 [:space:] 字符 class):

$ sed 's/^[^#][^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*/&chr/' file
21 9825796 chr21_9825796_C_T_b37

如果您不关心更改白色 space 那么只需使用任何 awk 执行此操作即可:

$ awk '!/^#/{="chr"} 1' file
21 9825796 chr21_9825796_C_T_b37

GNU sed解决方案,令file.txt内容为

# this is header
21 9825796 21_9825796_C_T_b37
21 9825796 21_9825796_C_T_b37

然后

sed -e '/^#/n' -e 's/\([^[:space:]]*\)/chr/3' file.txt

输出

# this is header
21 9825796 chr21_9825796_C_T_b37
21 9825796 chr21_9825796_C_T_b37

说明:我使用-e注册了两个表达式。首先意味着如果行以 # 开头,则按原样打印并转到下一个,第二个使用前缀为 chr 的出现替换零个或多个 non-whitespace 字符的第三次出现。我使用由 \(\) 表示的捕获组,因此我可以使用 .

来替换其内容

(在 GNU sed 4.2.2 中测试)