
Notei um awk
exemplo 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 -v
opçã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). -v
está descrito noOpçõesseção, a outra maneira é naOperandosseção.
Há uma diferença entre -v
passar 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 -v
opção. Provavelmente deveria funcionar para compatibilidade com versões anteriores, mas você não pode garantir. E como eu disse, a -v
opção é mais recente, então nem todas as versões awk
podem suportá-la.