주어진 파일에서 각 학생의 총점 찾기

주어진 파일에서 각 학생의 총점 찾기

문서:

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

스크립트:

#!/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

위 스크립트는 첫 번째 학생의 총 수를 생성할 수 있습니다. 또한 나머지 두 학생의 총점도 구하고 싶습니다. 누군가 나를 도와줄 수 있나요?

답변1

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

결과:

Rad, score = 468
Din, score = 375
Hardy, score = 320

awkstring 으로 시작하는 모든 줄에 대해 첫 번째 블록을 실행합니다 Name:. 변수에 값이 있으면 name이전 학생의 총점이 해당 학생의 이름과 함께 인쇄됩니다. 그런 다음 이름은 현재 행의 두 번째 필드로 설정되고 점수는 0으로 재설정됩니다. 그런 다음 스크립트는 즉시 다음 입력 줄로 계속됩니다.

두 번째 블록은 이전 블록에서 처리되지 않은 입력의 각 행에 대해 실행됩니다. score변수 값에 점수를 추가하기만 하면 됩니다 .

마지막 블록은 파일의 마지막 줄을 읽은 후 실행되며 첫 번째 블록에서 수행된 출력을 에뮬레이션합니다. 마지막 학생의 결과를 출력하는 것입니다.


코드를 복사하는 것은 보기 흉하므로 출력을 수행하는 함수를 사용하는 솔루션은 다음과 같습니다.

awk 'function output() { if (name) printf("%s, score = %d\n", name, score) } 
     /^Name:/          { output(); name = $2; score = 0; next }
                       { score += $2 }
     END               { output() }' file

이것은 질문의 일부는 아니지만 흥미로울 수 있습니다.

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

산출:

Rad      score = 468, mean = 93.6
Din      score = 375, mean = 75.0
Hardy    score = 320, mean = 64.0

답변2

검색할 수 있으며 Name, 하나를 찾을 때마다 다음 numm줄로 이동하여 점수를 합산합니다.

#!/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

결과:

Rad 468
Din 375
Hardy 320

답변3

동일한 효과를 얻으려면 다음 명령을 찾으십시오.

주문하다:

 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

산출

Total marks of Rad 468
Total marks of Din 375
Total marks of Hardy 320

관련 정보