를 사용하면 조건이 거짓 awk 0 inputfile
이므로 아무것도 인쇄되지 않는다는 것을 알았습니다.0
를 사용하면 awk가 true로 해석한 각 줄의 모든 내용을 인쇄 awk 1 inputfile
합니다 .1
를 사용하면 awk any_string inputfile
모든 awk 변수가 0으로 초기화되므로 아무것도 인쇄되지 않으므로 false입니다.
그런데 를 사용하면 awk any_integer inputfile
true가 되어 파일의 모든 줄을 인쇄하는데, 이유가 무엇인지 알 수 있나요?
이미 이 항목을 찾을 수 없습니다.GNU awk
매뉴얼하지만.
답변1
진짜awk의 경우 비어 있지 않습니다.끈또는 0이 아닌 숫자(숫자는 10진수 또는 부동 소수점 숫자이며 일부 awk 구현은 16진수 또는 8진수도 지원함)입니다. 큰따옴표로 묶인 것은 문자열이고, 따옴표가 없는 문자 그대로의 숫자는 숫자입니다. 그러나 그 밖의 경우에는 어떤 것이 문자열인지 숫자인지를 결정하는 복잡한 규칙이 있습니다. GNU awk
매뉴얼에는전체 장.
진짜:
awk '1'
(0이 아닌 숫자)awk '1e8'
(0이 아닌 숫자)awk '-0.01'
(0이 아닌 숫자)awk '"foo"'
(비어있지 않은 문자열)awk '"0"'
(비어있지 않은 문자열)awk '0 ""'
(연결은 여기서 비어 있지 않은 문자열을 생성합니다)echo 0 | awk '$1 ""'
($n 필드와 동일)awk 'substr("000", 1, 1)'
(결과는substr()
항상 문자열입니다)echo '0foo' | awk '$0'
($0은 숫자가 아닌 문자열이므로 문자열(비어있지 않음)로 처리됩니다.)
잘못된:
awk '0'
(0번)awk '""'
(빈 문자열)echo 0000e123 | awk '$1'
($1이 숫자형 문자열이고 0인 경우 숫자로 처리합니다.)echo ' 0 ' | awk '$0'
(문자열이 숫자인지 여부를 결정할 때 선행 및 후행 공백은 무시됩니다).awk '" 2foo" - 2'
(산술식에 포함된 문자열은 숫자로 변환되며, 해당 숫자 이후의 모든 내용은 무시됩니다.)awk 'unset_or_empty_variable'
(빈 문자열)awk '"non-numerical-string" + 0'
어 허:
awk '1e-500'
(누군가는 불평할 것이고, 누군가는 0으로 취급할 것이다)awk '"0x1" + 0'
(모든 awk 구현이 16진수를 지원하는 것은 아닙니다. 이를 수행하는 구현에서는 , 다른 구현에서는 This가"0x1"
로 변환되고 16 진수 환경은 여전히 인식됩니다).1
0
gawk
POSIXLY_CORRECT
awk '010 - 8'
(8진수와 동일합니다(단, 여기서 010은 문자열에서 변환되지 않고 리터럴이기 때문에 정확히는 아닙니다).awk '0x1 - 1'
(awk
16진수를 지원하지 않는 구현 에서는0x1
및 를 연결하면0
결과x1
변수가"0"
숫자(0)로 변환되고, 빼면 0이 아닌 숫자1
가 됩니다 .)-1
즉, 문자열이 비어 있지 않은지 확인하려면 다음을 수행하면 안 됩니다.
awk '$1 {$1 인쇄, "비어 있지 않음"}'
하지만
awk '$1 != "" {print $1, "is not empty"}'
그렇지 않으면 null이 아니 0
거나 말하지 않습니다 -0000E+00001234
.