Existem 2 maneiras de definir awk vars via linha de comando?

Existem 2 maneiras de definir awk vars via linha de comando?

Notei um awkexemplo de O'Reilly (1997) que atribuiu uma variável awk configurando-a na linha de comandodepoiso texto do programa. Funciona, mas não consigo encontrar essa sintaxe emcara / informação awk. Acabei de perder; é depreciado...? A única sintaxe que vi no manual é a -vopção.

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

Saída:cat dog

Responder1

Na verdade está em POSIXawk(link para POSIX 2008, versões anteriores também tinham, acredito). -vestá descrito noOpçõesseção, a outra maneira é naOperandosseção.

Há uma diferença entre -vpassar as atribuições no final com os nomes dos arquivos:

  • Com -v:

A aplicação deve garantir que o argumento de atribuição esteja na mesma forma que um operando de atribuição. A atribuição de variável especificada deve ocorrerantes de executar o programa awk, incluindo as ações associadas aos padrões BEGIN(caso existam). Várias ocorrências desta opção podem ser especificadas.

  • Misturado com os nomes dos arquivos:

[...] Cada uma dessas atribuições de variáveis ​​ocorrerápouco antes do processamento do seguinte arquivo, caso existam. Assim, uma atribuição antes do primeiro argumento do arquivo deverá ser executada após as ações BEGIN (se houver), enquanto uma atribuição após o último argumento do arquivo deverá ocorrer antes das ações END (se houver). Se não houver argumentos no arquivo, as atribuições deverão ser executadas antes do processamento da entrada padrão.

Exemplo:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four

Responder2

Este é um estilo antigo de definir variáveis ​​externamente no awk. Era ambíguo (e se você tivesse um nome de arquivo chamado foo=cat), então versões posteriores adicionaram uma -vopção. Provavelmente deveria funcionar para compatibilidade com versões anteriores, mas você não pode garantir. E como eu disse, a -vopção é mais recente, então nem todas as versões awkpodem suportá-la.

informação relacionada