참과 거짓의 awk 조건


9

우리가 사용 awk 0 inputfile하면 아무것도 인쇄하지 않을 것입니다 0.

를 사용하면 각 줄 awk 해석에 대해 true awk 1 inputfile로 모든 것을 인쇄 1합니다.

를 사용하면 awk any_string inputfile모든 awk 변수가 0으로 초기화되어 false로 초기화되므로 아무것도 인쇄하지 않습니다.

그러나 만약 우리가를 사용한다면 awk any_integer inputfile그것은 사실이되고 파일의 각 줄을 인쇄 할 것입니다.

나는 이것이 GNU awk매뉴얼 에서 설명 된 것을 찾을 수 없습니다 .


3
에 의해 any_integer난 당신 같은 평균 문자 수를 가정 7, 89등 그렇다면를 이유가 아닌 다른 번호입니다 0수단의 true조건
Sundeep

답변:


13

진정한 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의 연결 한 0x1수율 변수 "0"숫자 (0)으로 변환됩니다, 당신은 빼기 경우 1당신이 얻을 -1아닌 숫자입니다).

즉, 문자열이 비어 있지 않은지 확인하려면 다음을 수행하지 않아야합니다.

awk '$ 1 {print $ 1, "비어 있지 않습니다"}'

그러나

awk '$1 != "" {print $1, "is not empty"}'

그렇지 않으면 말하지 0않거나 -0000E+00001234비어 있지 않습니다 .


인상적이고 자세한 답변! 그러나 한 가지 질문 : 당신이 준 마지막 예제에서 나는 구문을 시도했고 첫 번째는 작동합니다. 빈 $ 1을 건너 뛰고 $ 1이 비어있는 행만 인쇄합니다. $ 1이 빈 문자열이면 원인이됩니다. 거짓, 따라서 출력을 인쇄하지 않습니까?
sylye
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.