Aqui está a awk
solution.
awk '{split($0,ary1,/[ ]+/); getline x; split(x,ary2,/[ ]+/);
for (i in ary1)if (!(ary1[i]+ary2[i])){ary1[i]=ary2[i]=9}}
END{for (r=1;r<=NF;r++) printf ("%d ", ary1[r]); printf"\n";
for (z=1;z<=NF;z++) printf ("%d ", ary2[z]); printf"\n"}' infile
Explicações:
-
split($0,ary1,/[ ]+/);
: lê e divide a primeira linha em uma matrizary1
com um ou mais delimitadores de espaços entre. -
getline x; split(x,ary2,/[ ]+/);
: lê a segunda linha na variávelx
e a divide no arrayary2
. -
for (i in ary1)if (!(ary1[i]+ary2[i])){ary1[i]=ary2[i]=9}}
: loop na matrizary1
para cada índice emi
se a soma de ambos os campos fosse zero (!(0)
acionaráif(1)
como condição real ) em seguida, defina o valor de ambos os campos como9
. -
for (r=1;r<=NF;r++) printf ("%d ", ary1[r]); printf"\n";
: imprima agora os valores finais de cada matrizary1
e na próxima linhaary2
.
Para aplicar em todos os 11 milhões de arquivos, salve as alterações no formato FILENAME.out
, onde FILENAME indica a leitura atual do arquivo nomedado por awk
.
awk '{split($0,ary1,/[ ]+/); getline x; split(x,ary2,/[ ]+/);
for (i in ary1)if (!(ary1[i]+ary2[i])){ary1[i]=ary2[i]=9}}
END{for (r=1;r<=NF;r++) printf ("%d ", ary1[r])>FILENAME".out"; printf"\n">FILENAME".out";
for (z=1;z<=NF;z++) printf ("%d ", ary2[z])>FILENAME".out"
}' wa_filtering_DP15_good_pops_snps_file_{1..11232111}