考虑以下文件 ( 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
Run Code Online (Sandbox Code Playgroud)
我想计算代表男性的所有记录并打印男性姓名,我需要从 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
Run Code Online (Sandbox Code Playgroud)
如您所见,计数成功,但程序会打印所有记录的名称,因为该if子句在第一条语句之后立即停止。
awk这样做的方法是
awk '$NF == "MALE" { ++count; print $2 } END { print count }' file
Run Code Online (Sandbox Code Playgroud)
也就是说,您指定了一些块和相关的触发条件。递增count和打印的条件$2是最后一个字段的值 ( $NF) 是 string MALE。打印的条件count是我们没有更多的输入。
你也可以用一个if语句来做到这一点:
awk '{ if ($NF == "MALE") { ++count; print $2 } } END { print count }' file
Run Code Online (Sandbox Code Playgroud)
(注意第一个块中额外的一组花括号;if否则语句的主体将只是下一个语句)但是程序很快变得难以阅读,并且由于$NF == "MALE"条件适用于该块中的所有代码,我们可以把它完全移出块。