
Eu tenho um grande arquivo de texto com 1.505.496 linhas no seguinte 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
.
.
e quero que minha saída desejada fique assim:
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
Existem 1153 números 'rs' e cada 'rs' tem valor ref e alt (primeira coluna se cada ref rs e segunda coluna for alt).
Responder1
Com GNU awk para arrays de arrays:
$ 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
Responder2
gawk (recurso de matriz multidimensional usado):
{
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"
}
}
Ele funciona armazenando todas rs[index]
as colunas a[key][index*2-1]
e a[key][index*2]
exibindo-as no END
, max_rs
é usado para armazenar o rs
número máximo.