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

조건부 블록 및 조건문(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

무엇이 잘못되고 있는지 볼 수 있습니다.

  • 이 오류를 어떻게 해결할 수 있나요?
  • 이 오류는 왜 발생합니까?
  • 조건문과 조건 블록의 차이점은 무엇입니까?

답변1

if문 에 일치하는 항목이 없으면 else해당 분기를 실행합니다.ifelse

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

간단한 수정:

$ 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이고 아무 작업도 수행되지 않는 경우입니다 . 매개변수가 없으면 기본적으로 인쇄됩니다.awkprintprint$0

답변2

두 번째 블록은

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

조건부 블록이 일치하면 무조건 블록을 건너뛰게 됩니다.

관련 정보