한 파일의 문자열을 다른 파일의 일치 항목으로 바꾸는 방법은 무엇입니까?

한 파일의 문자열을 다른 파일의 일치 항목으로 바꾸는 방법은 무엇입니까?

다음과 같은 파일이 있습니다: (308545줄)

head output11.bim
1   1:775852:T:C    0   775852  T   C
1   1:1120590:A:C   0   1120590 C   A
1   1:1145994:T:C   0   1145994 C   T
1   1:1148494:A:G   0   1148494 A   G
1   1:1201155:C:T   0   1201155 T   C
1   1:1468016:T:C   0   1468016 C   T
...

또 다른 파일(marker-info)에는 다음과 같이 쉼표로 구분된 처음 24줄의 주석이 포함되어 있습니다(총 500593줄).

1,742429,SNP_A-1909444,ss66079302,rs3094315,36.2,G,A,C,T,A,GCACAGCAAGAGAAAC[A/G]TTTGACAGAGAATACA,Sty,+,-,y,,,127,phs000018
1,769185,SNP_A-4303947,ss66273559,rs4040617,36.2,A,G,A,G,A,GCTGTGAGAGAGAACA[A/G]TGTCCCAATTTTGCCC,Sty,+,+,n,,,127,phs000018
1,775852,SNP_A-1886933,ss66317030,rs2980300,36.2,T,C,A,G,A,GAATGACTGTGTCTCT[C/T]TGAGTTAGTGAAGTCA,Nsp,-,+,y,,,127,phs000018
1,782343,SNP_A-2236359,ss66185183,rs2905036,36.2,C,T,C,T,A,CTCGATTTGTGTTCAA[C/T]ATATTTCATTTGTACC,Sty,-,-,n,,,127,phs000018
1,1120590,SNP_A-2205441,ss66174584,rs4245756,36.2,C,T,C,T,A,CCAGTGCTTTCAACCA[C/T]ACTCACTTTTCACTGT,Sty,+,+,n,,,127,phs000018
...

output11.bim의 두 번째 열을 첫 번째와 두 번째 열의 값이 일치하는 마커 정보의 다섯 번째 열로 바꾸려고 합니다. 따라서 이 예의 경우 output11.bim의 결과는 다음과 같습니다.

1   rs2980300   0   775852  T   C
1   rs4245756   0   1120590 C   A

답변1

$ cat tst.awk
NR==FNR { map[$1,$2]=$5; next }
($1,$4) in map { $2=map[$1,$4]; print }

$ awk -f tst.awk FS=',' marker-info FS=' ' output11.bim
1 rs2980300 0 775852 T C
1 rs4245756 0 1120590 C A

또는 스크립트에서 FS를 2개의 별도 값으로 설정하려는 경우:

$ cat tst.awk
BEGIN { FS="," }
NR==FNR { map[$1,$2]=$5; next }
FNR==1 { FS=" "; $0=$0 }
($1,$4) in map { $2=map[$1,$4]; print }

$ awk -f tst.awk marker-info output11.bim
1 rs2980300 0 775852 T C
1 rs4245756 0 1120590 C A

관련 정보