Réponse
Une variable shell est juste cela: une variable shell . Si vous souhaitez en faire une variable awk , vous avez besoin dune syntaxe telle que:
awk -v x="$x" "$2 == x {print $1}" infile
ou
awk "$2 == x {print $1}" x="$x" infile
Cependant, ceux-ci souffrent dun problème: les séquences déchappement y sont développées (et avec GNU awk 4.2 ou supérieur, si $x commence par @/ et se termine par /, il est traité comme une variable de type regexp ).
Donc, par exemple, si la variable shell contient les deux caractères barre oblique inverse et n , la variable awk finira par contenir le caractère newline (et avec gawk 4.2+, si elle contient @/foo/, la variable awk sera contenir foo et être de type regexp).
Une autre approche (mais qui nécessite un awk ou nawk POSIX ( contrairement à loriginal awk que lon trouve encore sur quelques Unices étranges)) est dutiliser des variables denvironnement:
Une autre approche (toujours avec des awks plus récents) consiste à utiliser le tableau ARGV dans awk:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Commentaires
Réponse
Vous ne pouvez « pas utiliser de variables externes dans awk directement, vous devez dabord les importer en tant que variables awk.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGVest en fait une fonctionnalité POSIX, elle ' s juste défini différemment dansgawk.ARGVetENVIRONsont POSIX mais pas dans le awk dorigine, désolé si je nétais ' pas clair à ce sujet. En quoi est-ce différent dansgawk?gawkinclut des options non reconnues dansARGV, alors que POSIXawkdoesn ' t.-fcomme dansawk -f script.awk arg1 arg2...où GNU awk ne ' t besoin dun--pour marquer la fin des options si arg1 commence par un-mais est ce nest pas une option valide dans cette version particulière deawk. Mais ce ' nest pas pertinent à ce sujet, et je ne me fierais certainement pas à ce comportement (jinclurais néanmoins le--).