使用bash中的awk,如何在“if”子句中执行多个语句?

使用bash中的awk,如何在“if”子句中执行多个语句?

考虑以下文件 ( 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子句在第一个语句之后立即停止。

答案1

这样做的方法awk

awk '$NF == "MALE" { ++count; print $2 } END { print count }' file

也就是说,您指定多个块以及关联的触发条件。递增count和打印的条件$2是最后一个字段的值 ( $NF) 是字符串MALE。打印的条件count是我们没有更多的输入。

可以也通过声明做到了这一点if

awk '{ if ($NF == "MALE") { ++count; print $2 } } END { print count }' file

(注意第一个块中额外的一组大括号;if否则语句的主体将只是下一个语句)但是程序很快就会变得难以阅读,并且由于条件$NF == "MALE"适用于全部该块中的代码,我们也可以将其完全移出该块。

答案2

awk 'BEGIN{count = 0} {if($6 == "MALE") {count+=1; print $2}} END{print count}' 

也就是说,创建一个用于计数和打印姓名的块,如果测试是男性,则执行该块。

答案3

只是为了跟进 JRFerguson 的答案,这就是你所拥有的,带有缩进:

# count the number of males, and print every name
if($6 == "MALE")
    count+=1
print $2

这是 JRFergusons 的答案,带有缩进

# count and print only the males
if($6 == "MALE") {
    count+=1
    print $2
}

awk 使用与 C 相同的支撑语义

相关内容