Risposta
Una variabile di shell è proprio questo: una shell variabile . Se vuoi trasformarlo in una variabile awk , hai bisogno di 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 successivo, se $x inizia con @/ e termina con /, viene trattato come un tipo di variabile regexp ).
Quindi, ad esempio, se la variabile di shell contiene i due caratteri barra rovesciata e n , la variabile awk finirà per contenere il carattere nuova riga (e con gawk 4.2+, se contiene @/foo/, la variabile awk contenere foo ed essere di tipo regexp).
Un altro approccio (ma che richiede un POSIX awk o nawk ( a differenza delloriginale awk come si trova ancora su alcuni Uni dispari)) consiste nellusare variabili dambiente:
Un altro approccio (sempre con awk più recenti) consiste nellusare larray ARGV in awk:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Commenti
Risposta
Non puoi “utilizzare variabili esterne in awk direttamente, devi prima importarle come awk variabili.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGVè in realtà una funzione POSIX, ' s appena definito in modo diverso ingawk.ARGVeENVIRONsono POSIX ma non nellawk originale, scusate se ' non era chiaro a riguardo. In che modo è diverso ingawk?gawkinclude opzioni non riconosciute inARGV, mentre POSIXawknon ' t.-fcome inawk -f script.awk arg1 arg2...dove GNU awk non ' non è necessario un--per contrassegnare la fine delle opzioni se arg1 inizia con-ma è non è unopzione valida in quella particolare versione diawk. Ma questo ' non è pertinente a questo argomento e sicuramente non farei affidamento su tale comportamento (includerei comunque--).