두 파일의 문자열을 일치시키고 문자열을 바꾸는 방법은 무엇입니까?

두 파일의 문자열을 일치시키고 문자열을 바꾸는 방법은 무엇입니까?

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

head output11.frq
 CHR               SNP   A1   A2          MAF  NCHROBS
   1      1:775852:T:C    T    C       0.1707     3444
   1     1:1120590:A:C    C    A      0.08753     3496
   1     1:1145994:T:C    C    T       0.1765     3496
   1     1:1148494:A:G    A    G       0.1059     3464
   1     1:1201155:C:T    T    C      0.07923     3496
...

또 다른 파일(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,1201155,SNP_A-2205441,ss66174584,rs4245756,36.2,C,T,C,T,A,CCAGTGCTTTCAACCA[C/T]ACTCACTTTTCACTGT,Sty,+,+,n,,,127,phs000018
...

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

1      rs2980300    T    C       0.1707     3444
1      rs4245756    T    C      0.07923     3496

이 작업을 시도했지만 빈 파일이 있습니다.

vi 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='\t' output11.frq  > output11X.frq

편집하다:

나는 이것을 실행하려고합니다 :

 vi test2.awk
 NR==FNR { map[$2]=$5 }
 NR!=FNR { split($4, x, ":"); if(x[2] in map){ $4=map[x[2]]; print }}

awk -f test2.awk FS=',' marker-info FS='\t' output11.frq > output11X.frq

하지만 나는 이것을 얻습니다:

head output11X.frq
 CHR               SNP   A1   A2          MAF  NCHROBS   rs41340551
   1      1:775852:T:C    T    C       0.1707     3444   rs41340551
   1     1:1120590:A:C    C    A      0.08753     3496   rs41340551
   1     1:1145994:T:C    C    T       0.1765     3496   rs41340551
...

답변1

11:775852:T:C스크립트의 문제는 키가 형식인 맵에서 문자열을 키로 사용하려고 한다는 것입니다 775852.

귀하가 귀하의 의견에서 필요하다고 생각하지 않는다고 언급했기 때문에 이 처리의 첫 번째 열을 생략했습니다.

NR==FNR { map[$2]=$5 }
NR!=FNR { split($2, x, ":"); if(x[2] in map){ $2=map[x[2]]; print }}

split저는 해당 문자열이 처리될 때까지 필요한 조회를 수행할 수 없기 때문에 문자열의 관련 부분을 가져와서 조건을 추가 하곤 했습니다 .

이것은 요청한 대로 수행되는 것 같습니다.

[gnubeard@mothership: ~/dna]$ awk -f test.awk FS=',' marker-info FS=' ' output11.frq
 1  rs2980300 T C 0.1707 3444
 1  rs4245756 T C 0.07923 3496

가지고 있는 필드가 가지고 있다고 생각하는 열과 일치하는지 확인하세요. 출력을 탭으로 구분하려면 OFS스크립트의 후반부에서 다음과 같이 변수를 설정할 수 있습니다.NR!=FNR { OFS="\t"; split($2, x, ":"); if(x[2] in map){ $2=map[x[2]]; print }}

FS편집: 출력11.frq의 구분 기호를 공백으로 변경하기 위해 명령의 변수를 변경했습니다 . 이렇게 하면 탭 수를 지루하게 조작하는 일이 방지됩니다.

관련 정보