$ awk -v OFS='\t' -f script.awk file
ID1 76 266
ID2 3762 62 1541
Onde script.awk
é
{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d", OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s", RS) }
Todos os blocos serão executados para cada linha de entrada do arquivo.
O primeiro bloco gera o ID.
O segundo bloco itera sobre os campos como você descreveu e gera os dados separados por OFS
(o separador do campo de saída, definido como uma guia na linha de comando).
O bloco final simplesmente exibe o separador de registro RS
, que é uma nova linha por padrão.
Alternativamente,
BEGIN { OFS = "\t" }
{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d", OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s", RS) }
para se livrar da necessidade de -v OFS='\t'
.
Como "one-liner":
$ awk 'BEGIN { OFS = "\t" }
{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d", OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s", RS) }' file
Para o problema prolongado:
{ printf("%s", $1) }
{ for (i=4; i<=NF; i+=2) { printf("%s%d%s%d", OFS, $(i-1), OFS, $i - $(i-1) - $(i-2)) } }
{ printf("%s%d%s%s", OFS, $NF, OFS, RS) }
Isso geraria o seguinte do arquivo original diretamente:
ID1 234 76 392 266 470
ID2 176 3762 869 62 347 1541 231