Como usar o padrão com variáveis no awk

2

Meu arquivo é como abaixo; Quero exibir os registros de alunos cuja porcentagem esteja acima de 80.

Studid    StudName     Asp.Net   DBMS     Unix
   1       Ani         75        62       80
   2       George      90        95       82
   3       Jake        45        30       40
   4       Dennie      89        92       90

então usei o seguinte código:

awk '(($3+$4+$5)/3)>80 {print}' stud

Funciona, mas quero atribuir essas colunas à variável e, em seguida, quero exibir a saída. Então eu tentei abaixo do código, mas não funcionou

awk 'total=$3+$4+$5, per=total/3, per>80 {print}' stud

alguma solução com variáveis?

    
por Dip 01.10.2016 / 10:23

2 respostas

5

Você pode mover a lógica da seção regra para uma ação

awk '{total=$3+$4+$5; per=total/3; if (per>80) print}' stud
   2       George      90        95       82
   4       Dennie      89        92       90

Observe que isso tenta avaliar aritmeticamente os cabeçalhos de coluna - o que "funciona" porque, em awk , os campos não numéricos são tratados como zero quando você tenta fazer aritmética neles - mas faria com que a linha de cabeçalho fosse impressa se, por exemplo, você alterou o teste para per<80 . Melhor IMHO seria ignorar explicitamente a linha de cabeçalho usando uma ação next para a regra NR==1

awk 'NR==1 {next} {total=$3+$4+$5; per=total/3; if (per>80) print}' stud
   2       George      90        95       82
   4       Dennie      89        92       90

ou, se você quiser o cabeçalho, imprima-o explicitamente

awk 'NR==1 {print; next} {total=$3+$4+$5; per=total/3; if (per>80) print}' stud
Studid    StudName     Asp.Net   DBMS     Unix
   2       George      90        95       82
   4       Dennie      89        92       90
    
por 01.10.2016 / 10:30
2

Tente:

awk ' 
# if /^Studid/ is matched move to the next record (row) of the input text
/^Studid/ { next }
{               
    total=$3+$4+$5
    per=total/3
    if (per > 80)  
        print 
}' stud

saída

   2       George      90        95       82
   4       Dennie      89        92       90
    
por 01.10.2016 / 10:34

Tags