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
ARGV
est en fait une fonctionnalité POSIX, elle ' s juste défini différemment dansgawk
.ARGV
etENVIRON
sont POSIX mais pas dans le awk dorigine, désolé si je nétais ' pas clair à ce sujet. En quoi est-ce différent dansgawk
?gawk
inclut des options non reconnues dansARGV
, alors que POSIXawk
doesn ' t.-f
comme 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--
).