awk '/^Name:/ { if (name) printf("%s, score = %d\n", name, score); name = $2; score = 0; next }
{ score += $2 }
END { printf("%s, score = %d\n", name, score) }' file
Resultado:
Rad, score = 468
Din, score = 375
Hardy, score = 320
O primeiro bloco awk
é executado para cada linha que começa com a string Name:
. Se a variável name
tiver um valor, a pontuação resumida do aluno anterior será impressa junto com o nome do aluno. Em seguida, o nome é definido para o segundo campo da linha atual e a pontuação é redefinida para zero. O script continua imediatamente com a próxima linha de entrada.
O segundo bloco é executado para cada linha de entrada que não é tratada pelo bloco anterior. Ele simplesmente adiciona a pontuação ao valor da variável score
.
O último bloco é executado depois de ler a última linha do arquivo e imita a saída feita no primeiro bloco. Isso é para que o resultado do último aluno seja produzido.
Duplicar código é feio, então aqui está uma solução que usa uma função para fazer a saída:
awk 'function output() { if (name) printf("%s, score = %d\n", name, score) }
/^Name:/ { output(); name = $2; score = 0; next }
{ score += $2 }
END { output() }' file
Isso não fazia parte da pergunta, mas pode ser interessante:
awk 'function output() { if (name) printf("%s\t score = %3d, mean = %.1f\n", name, score, score/count) }
/^Name:/ { output(); name = $2; score = count = 0; next }
{ score += $2; ++count }
END { output() }' file
Saída:
Rad score = 468, mean = 93.6
Din score = 375, mean = 75.0
Hardy score = 320, mean = 64.0