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


18

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

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

무엇이 잘못되었는지 알 수 있습니다.

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

답변:


26

에서 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기본적으로 인쇄 됩니다.


4
당신은 또한 그것을 골프 수 있습니다 awk '$2!=1?$2=0:"";1' file.
terdon

@terdon : 좋은 골프. OP를 이해하는 것이 어려울 수 있다고 생각합니다.
cuonglm

1
@cuonglm의 역할을 설명해 주시겠습니까 next? 첫 번째 인쇄가 참이면 두 번째 인쇄를 억제한다고 생각합니다. 같은 뭔가 continue에서 C.
Alexander Cska

@Alexander Cska : next현재 입력 라인 처리를 억제하고 다음 라인으로 건너 뜁니다. 와 동일한 역할 while이지만 전체 awk프로그램에 적용됩니다. 또한, awk자신의while
cuonglm

10

두 번째 블록

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.