Considere o seguinte arquivo ( 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
Quero contar todos os registros que representam um homem e imprimir os nomes dos homens, e preciso fazer isso no Bash. Como awk
lidar com duas declarações na cláusula 'if'?
Aqui está o que eu consegui:
awk 'BEGIN{count = 0} {if($6 == "MALE") count+=1; print $2} END{print count}' datafile
e a saída é:
Alice
Bob
Carol
Dee
Euler
Fiona
Gordon
Hana
Ivan
Jenora
5
Como você pode ver, a contagem é bem-sucedida, mas o programa imprime o nome de todos os registros, pois a if
cláusula para logo após a primeira instrução.
A
awk
maneira de fazer isso seriaOu seja, você especifica um número de blocos e as condições de disparo associadas. A condição para incrementar
count
e imprimir$2
é que o valor do último campo ($NF
) seja a stringMALE
. A condição para impressãocount
é que não tenhamos mais entrada.Você poderia ter feito isso com uma
if
declaração também:(observe o conjunto extra de chaves no primeiro bloco;
if
caso contrário, o corpo da instrução seria apenas a próxima instrução), mas o programa rapidamente se torna difícil de ler e, como a$NF == "MALE"
condição se aplica a todo o código nesse bloco, podemos bem movê-lo para fora do bloco completamente.Ou seja, crie um bloco para a contagem e a impressão do nome que será executado se o teste for do sexo masculino.
Apenas para acompanhar a resposta de JRFerguson, é isso que você tem, com recuo:
E esta é a resposta de JRFergusons, com recuo
Awk usa a mesma semântica de reforço que C