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
?
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 .
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.
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
.