¿Hay 2 formas de configurar awk vars mediante la línea de comando?

¿Hay 2 formas de configurar awk vars mediante la línea de comando?

Noté un awkejemplo de O'Reilly (1997) que asignaba una variable awk configurándola en la línea de comandodespuésel texto del programa. Funciona, pero no puedo encontrar esta sintaxis enhombre / información awk. ¿Me lo acabo de perder? ¿Está desvalorizado...? La única sintaxis que he visto en el manual es la -vopción.

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

Producción:cat dog

Respuesta1

En realidad está en POSIX.awk(enlace a POSIX 2008, creo que las versiones anteriores también lo tenían). -vse describe en elOpcionessección, la otra manera es en laOperandossección.

Hay una diferencia entre -vpasar las tareas al final con los nombres de los archivos:

  • Con -v:

La aplicación deberá garantizar que el argumento de asignación tenga la misma forma que un operando de asignación. La asignación de variable especificada se produciráantes de ejecutar el programa awk, incluidas las acciones asociadas con los patrones BEGIN(Si alguna). Se pueden especificar varias apariciones de esta opción.

  • Mezclado con los nombres de archivos:

[...] Cada una de dichas asignaciones variables se producirájusto antes del procesamiento del siguiente archivo, Si alguna. Por lo tanto, una asignación antes del primer argumento del archivo se ejecutará después de las acciones BEGIN (si las hay), mientras que una asignación después del último argumento del archivo se ejecutará antes de las acciones END (si las hay). Si no hay argumentos de archivo, las asignaciones se ejecutarán antes de procesar la entrada estándar.

Ejemplo:

$ 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

Respuesta2

Este es un estilo antiguo de configurar variables externamente en awk. Era ambiguo (¿y si tuviera un nombre de archivo llamado foo=cat), por lo que las versiones posteriores agregaron una -vopción? Probablemente debería funcionar para la compatibilidad con versiones anteriores, pero no se puede garantizar. Y como dije, la -vopción es más nueva, por lo que awkes posible que no todas las versiones la admitan.

información relacionada