Aqui está outra abordagem de awk
:
$ awk '{a[$4]=0;a[$5]=1; for(i=6;i<=NF;i++){$i=a[$i]}}1;' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1
Explicação
-
a[$4]=0;a[$5]=1;
: cria a matriza
com duas chaves,$4
e$5
. O valor para$4
está definido como0
e o valor de$5
para 1. -
for(i=6;i<=NF;i++){$i=a[$i]}
: para cada número de campo de 6 até o último, defina esse campo para o que estiver armazenado na matriz para o nucleotídeo encontrado. -
1;
: abreviação do atalho para "imprimir esta linha".
Você também pode fazer isso com o Perl:
$ perl -lane 's/$F[3]/0/ for @F[5..$#F]; s/$F[4]/1/ for @F[5..$#F]; print "@F"' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1
Esta é a mesma ideia. O -a
faz com que perl
aja como awk
, dividindo cada linha no espaço em branco na matriz @F
. Em seguida, substituímos todos os casos do nucleotídeo encontrado no quarto campo ( $F[3]
, matrizes começam em 0) com 0
e todos os casos do quinto ( $F[4]
) com 1
. O for @F[5..$#F]
significa que a substituição é aplicada apenas nos campos 6 a último. Finalmente, o array modificado é impresso.