파일이 있다고 가정합니다.
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
분기가 실행됩니다.
조건문에서 두 작업은 모두 조건이 참인지 거짓인지에 관계없이 실행됩니다.
간단한 수정 :
$ 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
를 인쇄합니다.
댓글
Answer
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
조건 블록이 일치하면 무조건 블록을 건너 뜁니다.
awk '$2!=1?$2=0:"";1' file
로 골프를 칠 수도 있습니다.next
의 역할을 설명해 주시겠습니까? 첫 번째 것이 사실이면 두 번째 인쇄물입니다.C
의continue
와 같은 형식입니다.next
는 현재 입력 행 처리를 억제하고 다음 행으로 건너 뜁니다.while
와 동일한 역할이지만 전체awk
프로그램에 적용됩니다. 또한awk
에는 자체while