web-dev-qa-db-fra.com

Que sont 0 $ et 1 $ (signe dollar 0 ou 1) dans un script awk?

dans awk :

 1  tolower($1) ~ /mary/ { print "CI Record: " $0; }
 2  $0 !~ /Mary/ { print "Not Mary: " $0; }
 3  $1 == "Mary" { print "Mary Record: " $0; }

Pourquoi 1 et 3 comparer $1 et 2 en utilisant $0?

17
0x90

En fait, l'exemple # 2 Utilise une expression régulière à cause de cette syntaxe

/regex/

Ce qui signifie dans votre exemple que si le texte littéral Mary ne se trouve nulle part dans la ligne entière ($0), Exécutez le code awk.

Alors que $1 == "Mary" Fait une comparaison directe entre le texte littéral Mary et le champ # 1 ($1).

Enfin, tolower($1) ~ /mary/ utilise à nouveau la correspondance regex ignre-case sur le champ # 1 et cela signifie que si $1 A du texte mary (ignore-case) alors exécutez le reste du code awk .

10
anubhava

En awk, $0 est toute la ligne d'arguments, tandis que $1 n'est que le premier argument d'une liste d'arguments séparés par des espaces. Donc, si je mets "Mary avait un petit agneau" dans awk, $1 est "Mary", mais $0 est "Marie avait un petit agneau". La deuxième ligne essaie de trouver la sous-chaîne "Mary" dans toute la ligne donnée à awk.

25
Advael

D'après la description de votre lien (accent sur le mien):

L'expression est généralement l'un des champs ou le résultat d'une opération sur l'un des champs. Par exemple, les règles de filtre AWK suivantes montrent, respectivement, comment comparer le premier champ à "mary" de manière non sensible à la casse, comment faire correspondre tous les enregistrements qui ne contiennent pas "Mary", et comment faire une comparaison exacte du premier champ avec "Mary":

Donc, décomposer:

Premier:

 how to compare the first field to “mary” in a case-insensitive fashion

Parce qu'il compare le premier champ, il utilise $1

comment faire correspondre tous les enregistrements qui ne contiennent pas "Mary",

Comme il compare tous les enregistrements, il utilise $0

Le troisième

et comment faire une comparaison exacte du premier champ avec "Mary":

En comparant à nouveau le premier champ, il utilise donc $1.

2
keyboardP