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

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

Meu arquivo está como abaixo; Quero exibir os registros de alunos cujo percentual está 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 depois exibir a saída. Então tentei o código abaixo, mas não funcionou

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

alguma solução com variáveis?

Responder1

Você pode mover a lógica doregraseção em umAçã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 os cabeçalhos das colunas aritmeticamente - o que "funciona" porque em awk, os campos não numéricos são tratados como zero quando você tenta fazer operações aritméticas com eles - mas faria com que a linha do cabeçalho fosse impressa se, por exemplo, você alterei o teste para per<80. Melhor IMHO seria pular explicitamente a linha do cabeçalho usando uma nextação para a regraNR==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

Responder2

Tentar:

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

informação relacionada