Reproduit de cela maintenant fermé en double question car il comprend des avertissements sur les limites de passage variable awk que l' on pourrait trouver utile.
Une variable shell n'est que cela: une variable shell . Si vous voulez le transformer en une variable awk , vous avez besoin d'une 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 d'un problème: les séquences d'échappement y sont développées (et avec GNU awk
4.2 ou supérieur, si elles $x
commencent @/
et se terminent /
, elles sont traitées comme une variable de type regexp ).
Ainsi, 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 de nouvelle ligne (et avec gawk 4.2+, si elle contient @/foo/
, la variable awk contiendra foo
et sera de type regexp
).
Une autre approche (mais qui, comme pour, -v
nécessite un awk ou un nawk POSIX (par opposition à l'awk des années 1970 toujours trouvé comme /bin/awk
dans Solaris)) consiste à utiliser des variables d'environnement:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
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
awk
développe les séquences d'échappement de type C dans$1
, de sorte que cette approche ne fonctionne pas si elle$1
peut contenir des barres obliques inverses (courantes pour les expressions rationnelles). Vous pouvez utiliser leENVIRON
tableau spécial awk à la place.