파일이 있다고 가정해 보겠습니다.
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
해당 분기를 실행합니다.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
답변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
조건부 블록이 일치하면 무조건 블록을 건너뛰게 됩니다.