Possibile duplicato:
Utilizza un parametro di script in awk
Ho uno script, in cui è presente uno snippet di script
x=3
awk '$2=$x{print $1}' infile
la variabile esterna è x,
ma viene visualizzato un errore in awk
quindi in questa situazione, come far funzionare correttamente awk?
grazie!
Risposta accettata:
Una variabile di shell è proprio questo:una shell variabile . Se vuoi trasformarlo in un awk variabile, è necessaria una sintassi come:
awk -v x="$x" '$2 == x {print $1}' infile
o
awk '$2 == x {print $1}' x="$x" infile
Tuttavia, quelli soffrono di un problema:le sequenze di escape sono espanse al loro interno (e con GNU awk
4.2 o superiore, se $x
inizia con @/
e termina con /
, viene trattata come un tipo di variabile regexp).
Quindi, ad esempio, se la variabile shell contiene i due caratteri barra rovesciata e n , la variabile awk finirà per contenere il newline carattere (e con gawk 4.2+, se contiene @/foo/
, la variabile awk conterrà foo
ed essere di tipo regexp
).
Un altro approccio (ma che richiede un POSIX awk o nawk (al contrario dell'originale awk che si trova ancora su alcuni Unice dispari)) consiste nell'utilizzare variabili di ambiente:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Un altro approccio (sempre con awks più recenti) consiste nell'usare l'array ARGV in awk:
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile