Intereting Posts
Конечная точка IPSec отправляет ICMP «недоступный; фрагмент ", пока он не маршрутизируется Как удалить двойные кавычки и точки из файла Telnet не выводит эхо из сценария xinetd Работает nfs для tcp, но не над udp Разрешение адресов трассировки исполняемого файла пользователя в ftrace Если условие не работает в скрипте над ssh Apt сломан после обновления python 14.04 – Нет модуля с именем 'lsb_release' Есть ли способ запустить «экран» в режиме только для чтения? Вращающиеся журналы iptables, странное сообщение о том, что скрипт преобразуется в стартовую работу Создание изображений AMD64 + mac Linux Как переименовать сотни файлов для всех, включая одно и то же слово в начале имени файла? Как удалить последнюю строку из всех файлов из каталога? Sed / awk / perl: изменение частей, сохраняющих текст, и выравнивание по столбцу Как задать меню настроек Терминатора? фактическое использование 'grub-mkimage –config ='

Как подсчитать вхождение строки, искать между шаблоном для определенной строки

Я работаю над скриптом 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 

Лично я бы сделал все на 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