Existem 2 maneiras de configurar o awk vars via linha de comando?

10

Eu notei um exemplo de O'Reilly awk (1997) que atribuiu uma variável awk configurando-a na linha de comando após o texto do programa. Ele funciona, mas não consigo encontrar essa sintaxe no man / info awk . Eu acabei de perder isso? é depreciada ...? A única sintaxe que vi no manual é a opção -v .

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

Saída: cat dog

    
por Peter.O 15.03.2012 / 18:12

2 respostas

11

Na verdade, é em POSIX awk (link para POSIX 2008, versões anteriores) eu também acredito). -v é descrito na seção Opções , o outro caminho está na seção Operandos .

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

  • com -v :

The application shall ensure that the assignment argument is in the same form as an assignment operand. The specified variable assignment shall occur prior to executing the awk program, including the actions associated with BEGIN patterns (if any). Multiple occurrences of this option can be specified.

  • Misturado com os nomes dos arquivos:

[...] Each such variable assignment shall occur just prior to the processing of the following file, if any. Thus, an assignment before the first file argument shall be executed after the BEGIN actions (if any), while an assignment after the last file argument shall occur before the END actions (if any). If there are no file arguments, assignments shall be executed before processing the standard input.

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
    
por 15.03.2012 / 18:24
4

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

    
por 15.03.2012 / 18:24

Tags