awk condição de verdadeiro e falso

8

Eu descobri que, se usarmos awk 0 inputfile , não será impresso nada porque 0 significa falso da condição.

Se usarmos awk 1 inputfile , ele irá imprimir tudo como 1 significa verdadeiro para cada linha awk interpret.

Se usarmos awk any_string inputfile , não será impresso nada, porque toda a variável awk inicializada como zero é falsa.

Mas se usarmos awk any_integer inputfile , isso se tornará verdadeiro e imprimiremos cada linha do arquivo, posso saber qual é o motivo?

Não consigo encontrar isso explicado no GNU awk manual embora.

    
por sylye 08.09.2016 / 12:25

1 resposta

12

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 de substr() é 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 em 1 , 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. Ainda gawk reconhece o número hexadecimal quando POSIXLY_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' (em awk implementações que não suportam números hexadecimais, 0x1 é a concatenação de 0 e a variável x1 que gera "0" que é convertido em um número (0), se você subtraia 1 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.

    
por 08.09.2016 / 12:53

Tags