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