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

들여쓰기가 포함된 JRFerguson의 답변은 다음과 같습니다.

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

awk는 C와 동일한 지원 의미를 사용합니다.

관련 정보