Encontre o total de marcas para cada aluno no arquivo fornecido

0

o arquivo:

Name: Rad
Eng: 94
Tam: 98
Mat: 98
Soc: 98
Sci: 80
Name: Din
Eng: 87
Tam: 89
Mat: 78
Soc: 87
Sci: 34
Name: Hardy
Eng: 78
Tam: 87
Mat: 23
Soc: 34
Sci: 98

o script:

#!/bin/bash
file=$1
num=$2
n='wc -l < $file'
it=$((n/num))
echo $n
echo $it
awk -v numm="$num" '{if (NR<=numm){T+=$2}}END{print T}' $file

Meu script acima pode gerar o total para o primeiro aluno. Eu quero encontrar total para duas marcas restantes de alunos também. Alguém pode me ajudar com isso?

    
por Radhakrishnan Rk 02.02.2018 / 13:55

3 respostas

1

Você pode pesquisar por Name e, sempre que encontrar, você vai para as próximas numm linhas e soma as pontuações:

#!/bin/bash
file=$1
num=$2
awk -v numm="$num" '
/Name/{
  mark = 0;
  printf("%s ",$2);
  for ( i=0; i<numm ; i++){
    getline;
    mark += $2;
  }
  printf("%d\n", mark);
}' $file

o resultado:

Rad 468
Din 375
Hardy 320
    
por 02.02.2018 / 14:19
3
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
    
por 02.02.2018 / 14:14
0

Por favor, encontre o comando abaixo para obter o mesmo

comando:

 for i in Rad Din Hardy
> do
> sed -n "/$i/,+5p" p.txt| awk -F ":" '{print $2}'| sed "/$i/d"| awk -v i="$i" 'BEGIN{sum=0}{sum=sum+$1}END {print "Total marks of " i " "  sum}'
> done

saída

Total marks of Rad 468
Total marks of Din 375
Total marks of Hardy 320
    
por 02.02.2018 / 15:14