True para awk é uma string não vazia ou um número diferente de zero (com números inteiros decimais ou ponto flutuante e com algumas implementações awk hexadecimais ou octal são suportados também). As coisas entre aspas duplas são strings, números literais sem numeração são números, mas para qualquer outra coisa, existem regras complexas para determinar se algo deve ser tratado como uma string ou um número. O manual GNU awk
tem um capítulo inteiro sobre isso .
Verdadeiro:
-
awk '1'
(número diferente de zero) -
awk '1e8'
(número diferente de zero) -
awk '-0.01'
(número diferente de zero) -
awk '"foo"'
(string não vazia) -
awk '"0"'
(string não vazia) -
awk '0 ""'
(concatenação produz uma string que aqui não é vazia) -
echo 0 | awk '$1 ""'
(o mesmo para um campo $ n) -
awk 'substr("000", 1, 1)'
(resultado desubstr()
é sempre uma string) -
echo '0foo' | awk '$0'
($ 0 é uma string não numérica, portanto, é considerada uma string (não vazia))
Falso:
-
awk '0'
(número 0) -
awk '""'
(string vazia) -
echo 0000e123 | awk '$1'
($ 1 é considerado um número se for uma string numérica que está aqui e sendo 0) -
echo ' 0 ' | awk '$0'
(espaços iniciais e finais são ignorados para determinar se uma cadeia é numérica). -
awk '" 2foo" - 2'
(uma string envolvida em uma expressão aritmética é convertida em um número com qualquer coisa além do número ignorado) -
awk 'unset_or_empty_variable'
(string vazia) -
awk '"non-numerical-string" + 0'
YMMV:
-
awk '1e-500'
(alguns irão reclamar, alguns irão tratá-lo como 0) -
awk '"0x1" + 0'
(nem todas as implementações awk suportam hexadecimais, em que as que"0x1"
são convertidas em1
, em outras,0
. Alguma versão da especificação POSIX inadvertidamente exigiu implementações para suportar esse número hex lá e tem sido retraída posteriormente. Aindagawk
reconhece o número hexadecimal quandoPOSIXLY_CORRECT
está no ambiente) -
awk '010 - 8'
(mesmo (bem não tanto quanto o 010 é literal aqui em oposição a convertido de uma string) para octais) -
awk '0x1 - 1'
(emawk
implementações que não suportam números hexadecimais,0x1
é a concatenação de0
e a variávelx1
que gera"0"
que é convertido em um número (0), se você subtraia1
você recebe-1
, que é um número diferente de zero).
O que isto significa é que, se você quiser verificar se uma string não está vazia, você não deve fazer:
awk '$1 {print $1, "is not empty"}'
Mas
awk '$1 != "" {print $1, "is not empty"}'
Caso contrário, não diria que 0
ou -0000E+00001234
não estão vazios.