Duplication possible :
Utiliser un paramètre de script dans awk
J'ai un script, dans lequel un extrait de script est
x=3
awk '$2=$x{print $1}' infile
la variable externe est x,
mais cela provoque une erreur dans awk
donc dans cette situation, comment faire fonctionner awk avec succès ?
merci !
Réponse acceptée :
Une variable shell n'est que cela :un shell variables . Si vous voulez en faire un awk variable, 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 $x
commence par @/
et se termine par /
, elle est traitée 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 newline caractère (et avec gawk 4.2+, s'il contient @/foo/
, la variable awk contiendra foo
et être de type regexp
).
Une autre approche (mais qui nécessite un awk ou un nawk POSIX (par opposition à l'awk d'origine que l'on trouve encore sur quelques Unix impairs)) consiste à utiliser des variables d'environnement :
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Une autre approche (toujours avec les nouveaux awks) consiste à utiliser le tableau ARGV dans awk :
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile