조건부 블록과 조건문 (if) ‘{if($2!=1){print $1,”0″}else{print

파일이 있다고 가정 해보십시오.

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분기 실행됩니다.

조건문에서 조건이 true 또는 false인지에 관계없이 두 조치가 모두 실행됩니다.

간단한 수정 :

$ 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 {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

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


답변