考虑以下文件 ( datafile
):
1001 Alice Rotterdam Netherland 48 FEMALE
1002 Bob Brussels Belgium 13 MALE
1003 Carol Tel-Aviv Israel 20 FEMALE
1004 Dee Manhattan USA 17 FEMALE
1005 Euler Paris French 71 MALE
1006 Fiona Paris French 12 MALE
1007 Gordon Moscow Russia 34 MALE
1008 Hana Kanto Japan 24 FEMALE
1009 Ivan Crimea Ukraine 30 MALE
1010 Jenora Crimea Ukraine 25 FENALE
我想计算所有代表男性的记录并打印男性姓名,我需要从 Bash 中完成。如何awk
处理'if'子句中的两个语句?
这是我得到的:
awk 'BEGIN{count = 0} {if($6 == "MALE") count+=1; print $2} END{print count}' datafile
输出是:
Alice
Bob
Carol
Dee
Euler
Fiona
Gordon
Hana
Ivan
Jenora
5
如您所见,计数成功,但程序会打印所有记录的名称,因为if
子句在第一条语句之后立即停止。
awk
这样做的方法是也就是说,您指定多个块和关联的触发条件。递增
count
和打印的条件$2
是最后一个字段的值 ($NF
) 是字符串MALE
。打印的条件count
是我们没有更多的输入。你也可以用一个
if
声明来做到这一点:(注意第一个块中额外的花括号;
if
否则语句的主体将只是下一条语句)但是程序很快变得难以阅读,并且由于$NF == "MALE"
条件适用于该块中的所有代码,我们可以将其完全移出街区。也就是说,如果测试是男性,则为计数和打印执行的名称创建一个块。
只是为了跟进 JRFerguson 的回答,这就是你所拥有的,带有缩进:
这是 JRFergusons 的答案,带有缩进
awk 使用与 C 相同的支撑语义