So verwenden Sie Muster mit Variablen in awk

So verwenden Sie Muster mit Variablen in awk

Meine Datei ist wie folgt; ich möchte die Datensätze der Studenten anzeigen, deren Prozentsatz über 80 liegt.

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

also habe ich folgenden Code verwendet:

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

Es funktioniert, aber ich möchte diese Spalten einer Variable zuweisen und dann die Ausgabe anzeigen. Also habe ich den folgenden Code ausprobiert, aber er hat nicht funktioniert

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

Irgendeine Lösung mit Variablen?

Antwort1

Sie können die Logik aus demRegelAbschnitt in eineAktion

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

Beachten Sie, dass hiermit versucht wird, die Spaltenüberschriften arithmetisch auszuwerten - was "funktioniert" awk, weil in nicht numerische Felder als Null behandelt werden, wenn Sie versuchen, mit ihnen Arithmetik durchzuführen -, aber dazu führen würde, dass die Überschriftenzeile gedruckt wird, wenn Sie beispielsweise den Test in ändern . Besser wäre es meiner Meinung nach, entweder die Überschriftenzeile explizit zu überspringen, indem Sie eine Aktion für die Regel per<80verwendennextNR==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

oder, wenn Sie die Kopfzeile wünschen, drucken Sie sie explizit aus

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

Antwort2

Versuchen:

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

Ausgabe

   2       George      90        95       82
   4       Dennie      89        92       90

verwandte Informationen