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」句の2つの文を処理する方法は?

これが私が得るものです:

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

インデントを含むJRFergusonの答えは次のとおりです。

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

awkはCと同じサポートセマンティクスを使用します。

関連情報