![문자열의 발생 횟수를 계산하는 방법, 패턴 사이에서 특정 문자열을 검색하는 방법](https://linux55.com/image/75682/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98%20%EB%B0%9C%EC%83%9D%20%ED%9A%9F%EC%88%98%EB%A5%BC%20%EA%B3%84%EC%82%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%2C%20%ED%8C%A8%ED%84%B4%20%EC%82%AC%EC%9D%B4%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EA%B2%80%EC%83%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음 시나리오로 ksh 스크립트를 작성 중입니다.
다음과 같은 학생 세부 정보가 포함된 학생 보고서 텍스트 파일이 있습니다.
Student_1
Name: ABC
Class:X
Head Teacher:SITA
Status: Pass
Student_1
Name: ABCE
Class:X
Head Teacher:SITA
Status: Pass
Student_2
Name:ABCD
Class:XI
Head Teacher:RYAN
Status: Fail
Student_50:
Name:MIKE
Class:X
Head Teacher:RYAN
Status:Fail
내가 해야 할 일은
Student_N
;로 시작하는 줄을 세어 학생 수를 구합니다.그 선을 통과한 학생 수와 실패한 학생 수를 세어보세요
Status:
.- 이름이 A로 시작하는 학생의 이름을 찾아보세요.
나는 다음을 포함하여 많은 것을 시도했습니다.
sed -n '/Student_i<< Status/,/Status/p' students_details.txt >> report_card.txt
sed '/^Student_i<< Status/,/)/Status/$/!d/Status/s/^Student_i<< Status (///Status/s/);$//' students_details.txt >> report_card.txt
sed '/^Student_i<< Status/,/)Status$/!d;s/^Student_i<< Status (//;s/);$//' students_details.txt >> report_card.txt
sed '/^pass/,/);$/!d;s/^pass (//;s/);$//' students_details.txt>> report_card.txt
내가 원하는 출력 파일은 다음과 같습니다.
포인트 1의 경우:
Student_1 : 2 Student_2 : 1 Student_50: 1
포인트 2의 경우:
Pass: 2 Fail: 2
포인트 3의 경우:
Count of Students whose name starts with "A" : 3
답변1
개인적으로 저는 Perl에서 모든 작업을 수행하겠습니다.
$ perl -00ne '/^(Student_\d+)/ && $count{$1}++;
/Name:\sA/ && $As++;
/Status:\s*Pass/ ? $pass++ : $fail++;
END{
print "$_ : $count{$_}\n" for keys(%count);
print "Pass: $pass\nFail:$fail\n";
print "Student names starting with A: $As\n"
}' file
Student_2 : 1
Student_1 : 1
Student_50 : 1
Pass: 2
Fail:2
Student names starting with A: 2
각 작업에 대해 별도의 명령을 사용하려는 경우 다음을 사용할 수 있습니다.
$ awk '/^Student_/{a[$0]++} END{for(s in a){print s,a[s]}}' file
Student_1 1
Student_2 1
Student_50: 1
$ perl -ne '$pass++ if /:\s*Pass/; $fail++ if /:\s*Fail/;
END{print "Pass: $pass\nFail: $fail\n"}' file
Pass: 2
Fail: 2
$ echo "Student names starting with A: $(grep -c "^Name:\s*A" file )"
Student names starting with A: 2