文字列の発生回数を計算する方法、パターン間で特定の文字列を検索する方法

文字列の発生回数を計算する方法、パターン間で特定の文字列を検索する方法

次のシナリオで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

おすすめ記事