我有一個 vcf 檔案。它看起來像這樣:它有一個 vcf 標頭,后跟基因型資訊。我想將 chr 添加到第三列。就像現在它看起來像:
21 9825796 21_9825796_C_T_b37
我想在第三列前面添加 chr,所以現在它應該如下所示:
21 9825796 chr21_9825796_C_T_b37
我使用了這個命令:
awk '{if($0 !~ /^#/) print "chr"$3; else print $3}' chr21_annotate.vcf > chr21_annotate_38_impute.vcf
但我無法獲得所需的輸出。誰能幫忙
uj5u.com熱心網友回復:
mawk '/^[^#]/*sub(/^/,"chr",$3)' 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 ' ($3="chr"$3)</^[^#]/'
# 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
uj5u.com熱心網友回復:
假設您確實確實有#以您不想更改的輸入中某處開始的行(根據您的代碼)并且您不想更改欄位之間的空白(根據您發布的影像)并且您想要穩健地執行它,因此即使早期的欄位可能包含與 $3 相同的字串并且您想要便攜地執行它......這將使用任何 POSIX sed(對于[:space:]字符類)執行您想要的操作:
$ sed 's/^[^#][^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*/&chr/' file
21 9825796 chr21_9825796_C_T_b37
如果您不關心更改空格,那么只需使用任何 awk 執行此操作:
$ awk '!/^#/{$3="chr"$3} 1' file
21 9825796 chr21_9825796_C_T_b37
uj5u.com熱心網友回復:
GNUsed解決方案,讓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\1/3' file.txt
輸出
# this is header
21 9825796 chr21_9825796_C_T_b37
21 9825796 chr21_9825796_C_T_b37
說明:我使用 . 注冊了兩個運算式-e。首先表示如果行以開頭,#然后按原樣列印并轉到下一個,第二次使用前綴為chr. 我使用由 表示的捕獲組\(,\)因此我可以使用它的內容替換使用\1.
(在 GNU sed 4.2.2 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/467385.html
上一篇:為什么當BOOL_VAR為假時Makefile運算式“exportINTEGER_VAR?=$(if$(BOOL_VAR),2,5)”會導致INTEGER_VAR=2?
