variable externe dans awk [duplicate]

Cette question a déjà des réponses ici :

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

  • Pour autant que je sache, ARGV est en fait une fonctionnalité POSIX, elle ' s juste défini différemment dans gawk.
  • @ChrisDown Oui, à la fois ARGV et ENVIRON sont POSIX mais pas dans le awk dorigine, désolé si je nétais ' pas clair à ce sujet. En quoi est-ce différent dans gawk?
  • gawk inclut des options non reconnues dans ARGV, alors que POSIX awk doesn ' t.
  • @ChrisDown, je pense que vous ' fait référence au cas où awk est appelé avec -f comme dans awk -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 de awk. Mais ce ' nest pas pertinent à ce sujet, et je ne me fierais certainement pas à ce comportement (jinclurais néanmoins le --).

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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *