우리가 사용 awk 0 inputfile
하면 아무것도 인쇄하지 않을 것입니다 0
.
를 사용하면 각 줄 awk 해석에 대해 true awk 1 inputfile
로 모든 것을 인쇄 1
합니다.
를 사용하면 awk any_string inputfile
모든 awk 변수가 0으로 초기화되어 false로 초기화되므로 아무것도 인쇄하지 않습니다.
그러나 만약 우리가를 사용한다면 awk any_integer inputfile
그것은 사실이되고 파일의 각 줄을 인쇄 할 것입니다.
나는 이것이 GNU awk
매뉴얼 에서 설명 된 것을 찾을 수 없습니다 .
답변
진정한 AWK에 대한 중 하나가 아닌 비어있는 문자열 (숫자 진수 정수 또는 부동 소수점 일부 AWK 구현 16 진수 또는 진수가 아니라 지원과) 또는 비 – 제로 번호입니다. 큰 따옴표로 묶인 것은 문자열이고 따옴표가없는 리터럴 숫자는 숫자이지만, 무엇이든 문자열이나 숫자로 취급할지 여부를 결정하는 복잡한 규칙이 있습니다. 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'
YMMV :
awk '1e-500'
(일부는 불평하고 일부는 0으로 취급합니다)awk '"0x1" + 0'
(모든 AWK 구현 않는 사람들에, 헥사을 지원하기"0x1"
로 변환됩니다1
다른 사람에,0
거기 16 진수를 지원하기 위해 실수로 필요한 구현.는 POSIX 사양의 일부 버전을하고 나중에 후퇴입니다. 아직gawk
때 16 진수를 인식하지POSIXLY_CORRECT
에 환경)awk '010 - 8'
(8 진수에 대해서는 (여기서 010이 문자열에서 변환되는 것과는 달리 문자 그대로 임)와 동일하지 않음)awk '0x1 - 1'
(에awk
진수 번호를 지원하지 않는 구현0x1
의 연결 한0
과x1
수율 변수"0"
숫자 (0)으로 변환됩니다, 당신은 빼기 경우1
당신이 얻을-1
아닌 숫자입니다).
즉, 문자열이 비어 있지 않은지 확인하려면 다음을 수행하지 않아야합니다.
awk '$ 1 {print $ 1, "비어 있지 않습니다"}'
그러나
awk '$1 != "" {print $1, "is not empty"}'
그렇지 않으면 말하지 0
않거나 -0000E+00001234
비어 있지 않습니다 .