Um script awk
que não contém o arquivo de entrada nem toda a tabela de resultados na memória:
FNR == 1 { for(i = 1; i <= NF; i++) a[i] = $i; next }
$1 == a[1] { for(i = 2; i <= NF; i++) a[i] += $i; next }
{
printf "%s", a[1]; a[1] = $1;
for(i = 2; i <= NF; i++) { printf "\t%s", a[i]; a[i] = $i };
printf "\n";
}
END {
printf "%s", a[1];
for(i = 2; i <= NF; i++) printf "\t%s", a[i];
printf "\n";
}
Para executá-lo:
awk -f script.awk data.txt
Resultados:
ABCD:1234 1.23 1.33 1.04 0
EFGH:5678 0 1.90 0.12 8.21
IJKL:9999 3.98 0 38.9 11.64
Em uma nota lateral: é possível fazer isso com sed
. Você não vai fazer isso em breve. Consulte aqui para ter uma ideia do motivo.