Posible duplicado:
Usar un parámetro de secuencia de comandos en awk
Tengo un script, en el que se encuentra un fragmento de script
x=3
awk '$2=$x{print $1}' infile
la variable externa es x,
pero genera un error en awk
entonces, en esta situación, ¿cómo hacer que awk se ejecute correctamente?
¡gracias!
Respuesta aceptada:
Una variable de shell es solo eso:un shell variables . Si quieres convertirlo en un awk variable, necesita una sintaxis como:
awk -v x="$x" '$2 == x {print $1}' infile
o
awk '$2 == x {print $1}' x="$x" infile
Sin embargo, tienen un problema:las secuencias de escape se expanden en ellos (y con GNU awk
4.2 o superior, si $x
comienza con @/
y termina en /
, se trata como un tipo de variable de expresión regular).
Entonces, por ejemplo, si la variable de shell contiene los dos caracteres barra invertida y n , la variable awk terminará conteniendo la nueva línea carácter (y con gawk 4.2+, si contiene @/foo/
, la variable awk contendrá foo
y ser del tipo regexp
).
Otro enfoque (pero que requiere un POSIX awk o nawk (a diferencia del awk original que todavía se encuentra en algunos Unices impares)) es usar variables de entorno:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Otro enfoque (todavía con awks más nuevos) es usar la matriz ARGV en awk:
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile