조건부 블록과 조건문 (if)

파일이 있다고 가정합니다.

PRO 1 GLN 5.55112e-17 ILE -6.245e-17 THR 5.55112e-17 

두 번째 열에서 1과 같지 않은 숫자를 가진 모든 줄은 0으로 변경하고 나머지는 유지합니다.

if (즉, 조건문), 모든 것이 정상입니다 :

awk "{if($2!=1){print $1,"0"}else{print $0}}" file PRO 1 GLN 0 ILE 0 THR 0 

하지만 조건부 블록을 사용하면 원하지 않는 일이 발생합니다.

awk "$2!=1 {print $1,"0"} {print $0}" file PRO 1 GLN 0 GLN 5.55112e-17 ILE 0 ILE -6.245e-17 THR 0 THR 5.55112e-17 

무엇이 잘못되었는지 확인할 수 있습니다.

  • 이 오류는 어떻게 수정합니까?
  • 이 오류가 발생하는 이유는 무엇입니까?
  • 조건문과 조건 블록의 차이점은 무엇입니까?

답변

if 문에는 else가 있습니다. if가 일치하지 않으면 else 분기가 실행됩니다.

조건문에서 두 작업은 모두 조건이 참인지 거짓인지에 관계없이 실행됩니다.

간단한 수정 :

$ awk "$2!=1 {print $1,"0";next};{print $0}" file PRO 1 GLN 0 ILE 0 THR 0 

그리고 더 간결하게 만들 수 있습니다.

$ awk "$2 != 1 {print $1,"0";next};1" file PRO 1 GLN 0 ILE 0 THR 0 

조건이 true이고 1 작업이없는 경우 awk 기본 동작은 print입니다. 인수가없는 print는 기본적으로 $0를 인쇄합니다.

댓글

  • awk '$2!=1?$2=0:"";1' file로 골프를 칠 수도 있습니다.
  • @ terdon : 좋은 골프입니다. 이해하기에는 OP가 어려울 수 있습니다.
  • @cuonglm next의 역할을 설명해 주시겠습니까? 첫 번째 것이 사실이면 두 번째 인쇄물입니다. Ccontinue와 같은 형식입니다.
  • @Alexander Cska : next는 현재 입력 행 처리를 억제하고 다음 행으로 건너 뜁니다. while와 동일한 역할이지만 전체 awk 프로그램에 적용됩니다. 또한 awk에는 자체 while

Answer

awk "$2!=1 {print $1,"0"} {print $0}" file 

의 두 번째 블록은 조건부가 아닙니다. 모든 행에 대해 실행되므로 모든 줄.

대신 다음과 같이 작성하십시오.

awk "$2!=1 {print $1,"0"} $2==1 {print $0}" file 

또는 다음과 같이 작성하십시오.

awk "$2!=1 {print $1,"0"; next} {print $0}" file 

조건 블록이 일치하면 무조건 블록을 건너 뜁니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다