파일이 있다고 가정 해보십시오.
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
조건부 블록이 일치하면 조건부 블록을 건너 뜁니다.