Você pode converter a lista de valores em linhas com 5 valores com column
.
Assumindo guias são 8 espaços (e valores são menores que isso):
$ column -c 40 -x infile
1 2 3 4 5
6 7 8 9 10
1 0 2 3 0
0 1 0 0 2
0 3 0 4 0
5 0 2
E traduza cada guia para um + para alimentar bc:
$ column -c 40 -x infile | tr '\t' '+'
1+2+3+4+5
6+7+8+9+10
1+0+2+3+0
0+1+0+0+2
0+3+0+4+0
5+0+2
$ column -c 40 -x infile | tr '\t' '+' | bc
15
40
6
3
7
7
Talvez o awk seja melhor:
$ column -c 40 -x infile | awk '{print($1+$2+$3+$4+$5)}'
15
40
6
3
7
7
Essa é apenas uma chamada para cada programa, ambos os programas serão iniciados ao mesmo tempo devido ao pipe e funcionarão em paralelo.
O tempo me dá (em uma CPU muito lenta) apenas 0.350 segundos para um arquivo de 100.000 linhas.
E apenas 0,148 segundo se o resultado for para um arquivo (não para a tela).
Sim, isso lida com linhas incompletas, um arquivo que termina em 1, 2, 3 ou 4 números.
Isso funcionará corretamente se os números forem menores que 1.000.000.
Números maiores (até uma soma de (2 ^ 62) -1 9223372036854775807 ~ 9e18 em um sistema de 64 bits) precisarão de algo como:
$ xargs -n 5 -a infile| awk '{print($1+$2+$3+$4+$5)}'
Mas isso é bem mais lento (38,8 segundos), mudando para o awk puro
$ awk '{s+=$0};NR%5{next};!(NR%5){print(s);s=0}END{if(s){print(s)}}' infile
Ou, se você precisar de um pipe, use:
$ cat infile | awk '{s+=$0};NR%5{next};!(NR%5){print(s);s=0}END{if(s){print(s)}}'
Leva cerca de 0,150 segundos, o que parece rápido o suficiente para mim.