Como contar uma ocorrência de string, pesquise entre um padrão para uma string específica

1

Estou trabalhando em um script ksh cujo cenário é o seguinte:

Eu tenho um arquivo de texto para os relatórios dos alunos que contém detalhes dos alunos como:

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

O que eu preciso fazer é

  1. Encontre o número de alunos contando as linhas que começam com Student_N ;

  2. Conte quantos alunos foram aprovados e quantos alunos falharam ao usar a linha Status: .

  3. Encontre o nome dos alunos cujo nome começa com A.

Eu tentei várias coisas, incluindo:

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

Meus arquivos de saída desejados são:

  • Para o ponto 1:

    Student_1 : 2
    Student_2 : 1
    Student_50: 1
    
  • Para o ponto 2:

    Pass: 2
    Fail: 2
    
  • Para o ponto 3:

    Count of Students whose name starts with "A" : 3
    
por A.K. Singh 22.10.2015 / 09:08

1 resposta

2

Pessoalmente, eu faria tudo em 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

Se você insistir em comandos separados por operação, poderá usar:

$ 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
    
por 22.10.2015 / 15:23