编辑 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 中测试)
我有一个 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 中测试)