문서:
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
awk
string 으로 시작하는 모든 줄에 대해 첫 번째 블록을 실행합니다 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