파일의 열을 다른 파일의 조회 테이블로 바꾸기

파일의 열을 다른 파일의 조회 테이블로 바꾸기

조회 테이블의 값을 바꾸려는 여러 개의 쉼표로 구분된 값이 있는 열이 있는 탭으로 구분된 파일이 있습니다.

파일 찾기:

  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

관련 정보