
Noté un awk
ejemplo 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 -v
opció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). -v
se describe en elOpcionessección, la otra manera es en laOperandossección.
Hay una diferencia entre -v
pasar 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 -v
opción? Probablemente debería funcionar para la compatibilidad con versiones anteriores, pero no se puede garantizar. Y como dije, la -v
opción es más nueva, por lo que awk
es posible que no todas las versiones la admitan.