如何在 awk 中使用带有变量的模式

如何在 awk 中使用带有变量的模式

我的文件如下;我想显示百分比高于 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

所以我使用了以下代码:

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

它有效,但我想将这些列分配给变量,然后显示输出。所以我尝试了下面的代码,但它不起作用

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

有变量的解决方案吗?

答案1

您可以将逻辑从规则节成行动

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

请注意,这会尝试以算术方式计算列标题 - 这“有效”,因为在 中awk,当您尝试对非数字字段进行算术运算时,非数字字段将被视为零 - 但会导致标题行被打印,例如,如果您将测试更改为per<80.恕我直言,更好的方法是使用next规则的操作显式跳过标题行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

或者,如果您想要标题,请显式打印它

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

答案2

尝试:

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

输出

   2       George      90        95       82
   4       Dennie      89        92       90

相关内容