조회 테이블의 값을 바꾸려는 여러 개의 쉼표로 구분된 값이 있는 열이 있는 탭으로 구분된 파일이 있습니다.
파일 찾기:
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 파일을 만들고 루프에서 실행하는 것입니다. 이 작업을 수행하는 더 좋은 방법입니다.
답변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
답변2
$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == FNR {
map[$2] = $1
next
}
{
n = split($NF,g,/[[:space:]]*,[[:space:]]*/)
out = ""
for ( i=1; i<=n; i++ ) {
out = (i>1 ? out ", " : "") (g[i] in map ? map[g[i]] : g[i])
}
$NF = out
print
}
$ awk -f tst.awk 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