
Tengo un archivo de texto grande con 1.505.496 filas en el siguiente formato:
PAN rs1 G G
PAB rs1 G G
PAC rs1 G G
PAE rs1 G G
PAT rs1 G G
PAN rs2 T T
PAB rs2 T T
PAC rs2 T T
PAE rs2 T T
PAT rs2 T T
PAN rs3 A C
PAB rs3 A C
PAC rs3 A C
PAE rs3 A C
PAT rs3 A C
.
.
y quiero que el resultado deseado se vea así:
Rs1 rs1 rs2 rs2 rs3 rs3 ....
PAN G G T T A C
PAB G G T T A C
PAC G G T T A C
PAE G G T T A C
PAT G G T T A C
Hay 1153 números 'rs' y cada 'rs' tiene valor ref y alt (primera columna si cada rs ref y segunda columna es alt).
Respuesta1
Con GNU awk para matrices de matrices:
$ cat tst.awk
BEGIN { OFS="\t" }
!seen[$1]++ { rowIds[++numRows] = $1 }
!seen[$2]++ { colIds[++numCols] = $2 }
{ vals[$1][$2] = $3 OFS $4 }
END {
printf "%s%s", "", OFS
for (colNr=1; colNr<=numCols; colNr++) {
colId = colIds[colNr]
printf "%s%s%s%s", colId, OFS, colId, (colNr<numCols ? OFS : ORS)
}
for (rowNr=1; rowNr<=numRows; rowNr++) {
rowId = rowIds[rowNr]
printf "%s%s", rowId, OFS
for (colNr=1; colNr<=numCols; colNr++) {
colId = colIds[colNr]
printf "%s%s", vals[rowId][colId], (colNr<numCols ? OFS : ORS)
}
}
}
$ awk -f tst.awk file
rs1 rs1 rs2 rs2 rs3 rs3
PAN G G T T A C
PAB G G T T A C
PAC G G T T A C
PAE G G T T A C
PAT G G T T A C
Respuesta2
gawk (función de matriz multidimensional utilizada):
{
if($2 ~ "rs[0-9]+")
{
idx = substr($2, 3)
max_rs = idx > max_rs ? idx : max_rs
a[$1][idx * 2 - 1] = $3
a[$1][idx * 2] = $4
}
}
END{
# header
printf "\t"
for (i = 1; i <= max_rs; ++i) {
printf "rs" i "\trs" i "\t"
}
printf "\n"
# entries
for (entry in a) {
printf entry "\t"
for (i = 1; i <= max_rs*2; ++i) {
printf a[entry][i] "\t"
}
printf "\n"
}
}
Funciona almacenando todas rs[index]
las columnas a[key][index*2-1]
y a[key][index*2]
generándolas en el END
, max_rs
se utiliza para almacenar el rs
número máximo.