awk는 참과 거짓의 조건을 결정합니다

awk는 참과 거짓의 조건을 결정합니다

를 사용하면 조건이 거짓 awk 0 inputfile이므로 아무것도 인쇄되지 않는다는 것을 알았습니다.0

를 사용하면 awk가 true로 해석한 각 줄의 모든 내용을 인쇄 awk 1 inputfile합니다 .1

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

그런데 를 사용하면 awk any_integer inputfiletrue가 되어 파일의 모든 줄을 인쇄하는데, 이유가 무엇인지 알 수 있나요?

이미 이 항목을 찾을 수 없습니다.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 진수 환경은 여전히 ​​인식됩니다).10gawkPOSIXLY_CORRECT
  • awk '010 - 8'(8진수와 동일합니다(단, 여기서 010은 문자열에서 변환되지 않고 리터럴이기 때문에 정확히는 아닙니다).
  • awk '0x1 - 1'( awk16진수를 지원하지 않는 구현 에서는 0x1및 를 연결하면 0결과 x1변수가 "0"숫자(0)로 변환되고, 빼면 0이 아닌 숫자 1가 됩니다 .)-1

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

awk '$1 {$1 인쇄, "비어 있지 않음"}'

하지만

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

그렇지 않으면 null이 아니 0거나 말하지 않습니다 -0000E+00001234.

관련 정보