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
.ARGV
eENVIRON
sono POSIX ma non nellawk originale, scusate se ' non era chiaro a riguardo. In che modo è diverso ingawk
?gawk
include opzioni non riconosciute inARGV
, mentre POSIXawk
non ' t.-f
come 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--
).