Awk
用另一個文件中的查找表替換文件中的列
我有一個製表符分隔的文件,其中有一列有多個用逗號分隔的值,我想在其中替換查找表中的值
查找文件:
ID Name g_00001 g_00001 g_00002 cytA g_00003 g_00003 g_00004 mntB g_00005 recF g_00006 gyaN g_00007 traR g_00008 g_00008 g_00009 g_00009 g_00010 hypE
輸入文件:
Name Start Stop Strand Number of Genes Genes op00001 1544 5454 + 2 cytA, g_00001 op00002 7026 12012 + 2 recF, mntB op00003 15215 16854 - 3 g_00010,cytA, g_00009 op00004 19856 25454 - 2 hypE, g_00020 op00005 20791 23568 + 2 gyaN, g_00005
輸出文件:
Name Start Stop Strand Number of Genes Genes op00001 1544 5454 + 2 g_00002, g_00001 op00002 7026 12012 + 2 g_00005, g_00004 op00003 15215 16854 - 3 g_00010, g_00002, g_00009 op00004 19856 25454 - 2 g_00010, g_00020 op00005 20791 23568 + 2 g_00006, g_00005
基於此處的一些範例,我嘗試了以下程式碼
awk -F';' 'NR==FNR{a[$2]=$1;next}{$6=a[$1]}1' lookup input
它沒有改變任何東西。
另一種方法是使用 sed -i ’s/cytA/g_00002/’ 逐個嘗試並為每一行創建 sed 文件並循環執行它是我的想法,但我想檢查是否有更好的方法.
那些“用逗號分隔的多個值”用逗號和(在大多數但不是所有情況下)空格分隔,這並不容易處理它們。嘗試調整欄位分隔符並將每個基因作為單個欄位進行操作:
awk -F"[, \t]*" ' NR==FNR {a[$2] = $1 next } {for (i=6; i<=NF; i++) if ($i in a) sub($i, a[$i]) } 1 ' OFS="\t" Lookup_file input_file Name Start Stop Strand Number of Genes Genes op00001 1544 5454 + 2 g_00002, g_00001 op00002 7026 12012 + 2 g_00005, g_00004 op00003 15215 16854 - 3 g_00010,g_00002, g_00009 op00004 19856 25454 - 2 g_00010, g_00020 op00005 20791 23568 + 2 g_00006, g_00005