Cómo usar patrón con variables en awk

Cómo usar patrón con variables en awk

Mi archivo es el siguiente; Quiero mostrar aquellos registros de estudiantes cuyo porcentaje sea superior a 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

entonces utilicé el siguiente código:

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

Funciona, pero quiero asignar estas columnas a una variable y luego mostrar el resultado. Así que probé el siguiente código, pero no funcionó.

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

¿Alguna solución con variables?

Respuesta1

Puedes mover la lógica desde elreglasección en unacción

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

Tenga en cuenta que esto intenta evaluar los encabezados de las columnas aritméticamente, lo cual "funciona" porque en awk, los campos no numéricos se tratan como cero cuando intenta hacer aritmética con ellos, pero causaría que la línea del encabezado se imprimiera si, por ejemplo, cambió la prueba a per<80. En mi humilde opinión, sería mejor omitir explícitamente la línea del encabezado usando una nextacción para la regla.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

o, si desea el encabezado, imprímalo explícitamente

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

Respuesta2

Intentar:

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

producción

   2       George      90        95       82
   4       Dennie      89        92       90

información relacionada