ルックアップテーブルの値を変更したい複数のカンマ区切り値を持つ列を持つタブ区切りファイルがあります。
ファイルを探す:
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