¿Cómo hacer coincidir cadenas en dos archivos y reemplazar cadenas?

¿Cómo hacer coincidir cadenas en dos archivos y reemplazar cadenas?

Tengo un archivo como este: (tiene 308545 líneas)

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
...

Y otro archivo (marker-info) que tiene las primeras 24 líneas comentadas y está separado por comas y se ve así (tiene un total de 500593 líneas):

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
...

Quiero reemplazar la segunda columna en salida11.frq con la quinta columna en información de marcador que tiene el valor coincidente en la primera y segunda columna, por lo que para este ejemplo el resultado de salida11.frq se vería así:

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

Intenté hacer esto pero obtuve el archivo vacío:

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

EDITAR:

Intenté ejecutar esto:

 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

pero tengo esto:

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
...

Respuesta1

El problema con tu script era que intentabas usar cadenas como 11:775852:T:Cclaves en un mapa cuyas claves tienen el formato 775852.

He omitido la primera columna de este procesamiento ya que mencionaste en un comentario que no crees que sea necesario.

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

Solía split​​obtener la parte relevante de la cadena y agregué un condicional ya que hasta que se procese esa subcadena, no hay forma de realizar la búsqueda que necesita.

Esto parece funcionar según lo solicitado:

[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

Asegúrese de que los campos que tiene estén alineados con las columnas que cree que tiene. Si desea que la salida esté delimitada por tabulaciones, puede configurar la OFSvariable en la segunda mitad del script, así:NR!=FNR { OFS="\t"; split($2, x, ":"); if(x[2] in map){ $2=map[x[2]]; print }}

EDITAR: Cambié la FSvariable en el comando para cambiar el delimitador de salida11.frq a espacios en blanco. Esto evitará complicaciones con el número de pestañas.

información relacionada