ファイルの列を別のファイルのルックアップテーブルに置き換える

ファイルの列を別のファイルのルックアップテーブルに置き換える

ルックアップテーブルの値を変更したい複数のカンマ区切り値を持つ列を持つタブ区切りファイルがあります。

ファイルを探す:

  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

何も変わりません。

もう1つの方法は、sed -i 's / cytA / g_00002 /'を使用して1つずつ試して、各行に対してsedファイルを作成してループで実行することです。これを行うより良い方法です。

ベストアンサー1

これらの「カンマで区切られた複数値」は、カンマと(すべての場合ではありませんが、ほとんどの場合)スペースで区切られているため、操作が簡単になりません。フィールド区切り記号を調整し、各遺伝子を単一のフィールドとして機能させてください。

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

おすすめ記事