문자열의 발생 횟수를 계산하는 방법, 패턴 사이에서 특정 문자열을 검색하는 방법

문자열의 발생 횟수를 계산하는 방법, 패턴 사이에서 특정 문자열을 검색하는 방법

다음 시나리오로 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

내가 해야 할 일은

  1. Student_N;로 시작하는 줄을 세어 학생 수를 구합니다.

  2. 그 선을 통과한 학생 수와 실패한 학생 수를 세어보세요 Status:.

  3. 이름이 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

관련 정보