Awk

用另一個文件中的查找表替換文件中的列

  • June 11, 2022

我有一個製表符分隔的文件,其中有一列有多個用逗號分隔的值,我想在其中替換查找表中的值

查找文件:

 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

引用自:https://unix.stackexchange.com/questions/705826