Aqui está uma abordagem:
$ awk '$2!=old && NR>1 {for (i=1;i<=NF;i++) printf a[old","i]" "; print"";} {old=$2;for (i=1;i<=NF;i++) {if (a[$2","i]=="." || a[$2","i]=="") a[$2","i]= $i}} END{for (i=1;i<=NF;i++) printf a[old","i]" "; print"";}' file
chr1 45162 A . C T
chr1 45257 A . . T
chr1 45413 A . . T
chr1 46844 A . C .
chr1 72434 A G . .
chr1 72515 A . C T
chr1 77689 A G . .
Como funciona
-
$2!=old && NR>1 {for (i=1;i<=NF;i++) printf a[old","i]" "; print"";}
Após a primeira linha, para cada vez que encontrarmos um novo valor para a segunda coluna, imprima os resultados do valor anterior.
-
old=$2;for (i=1;i<=NF;i++) {if (a[$2","i]=="." || a[$2","i]=="") a[$2","i]= $i}
Atualize a matriz
a
com o valor da linha atual.O GNU
awk
tem bons arrays 2D. Para compatibilidade, no entanto, estou usando o substituto compatível com POSIX. -
END{for (i=1;i<=NF;i++) printf a[old","i]" "; print"";}
Após a última linha, imprima as informações para a seção final.