
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:C
claves 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 OFS
variable 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 FS
variable en el comando para cambiar el delimitador de salida11.frq a espacios en blanco. Esto evitará complicaciones con el número de pestañas.