Pourquoi awk imprime-t-il toute la ligne quand je veux qu'il imprime une variable?

24

Quand je tape:

echo "foo bar" | gawk -v var="content" '{print $var}'

Je m'attends à ce que la sortie soit content. Pourquoi foo bar?

nicoco
la source
8
Essayez de supprimer $de $ var
taliezin
Effectivement. Je me suis confondu avec la syntaxe bash ...
nicoco
C'est une bonne question et bien que la réponse montre que le $était mal placé, je ne suis pas sûr qu'il devrait être fermé comme faute de frappe. J'en ai vu plusieurs récemment, alors peut-être en avons-nous besoin d'un canon
roaima

Réponses:

45

Les variables sont référencées par leur nom comme dans var, pas $vardans awk. $nfait référence au champ ne : pour le premier champ, pour le second ... ou l'enregistrement entier pour == 0 ( est l'enregistrement complet).$1$2n$0

Il ne s'agit pas nécessairement de nombres littéraux. Vous pouvez utiliser $(1+1)ou $variable. Si variablecontient 1, alors $variablesera le premier champ. Un $NFchamp couramment utilisé concerne le dernier champ ( NFc'est la variable spéciale qui contient le nombre de champs).

Si, comme dans votre exemple, la variable ne contient pas de nombre, ce non-nombre est compris comme 0.

Donc var="content"; print $var, c'est la même chose var=0; print $var, et donc la même chose que print $0, c'est imprimer tout l'enregistrement.

Ce que vous voulez ici, c'est:

echo "foo bar" | gawk -v var="content" '{print var}'
Stéphane Chazelas
la source