variabile esterna in awk [duplicate]

Questa domanda ha già una risposta qui :

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

  • Per quanto ne so, ARGV è in realtà una funzione POSIX, ' s appena definito in modo diverso in gawk.
  • @ChrisDown Sì, sia ARGV e ENVIRON sono POSIX ma non nellawk originale, scusate se ' non era chiaro a riguardo. In che modo è diverso in gawk?
  • gawk include opzioni non riconosciute in ARGV, mentre POSIX awk non ' t.
  • @ChrisDown, penso che tu ' si riferisce al caso in cui awk viene chiamato con -f come in awk -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 di awk. Ma questo ' non è pertinente a questo argomento e sicuramente non farei affidamento su tale comportamento (includerei comunque --).

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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *