awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
- Le
-F
drapeau définit le séparateur de champ; Je le mets entre guillemets car il s’agit d’un caractère de shell spécial.
$1 ~ /smiths/
Applique ensuite le {bloc de code} suivant uniquement aux lignes où le premier champ correspond à la regex /smiths/
.
- Le reste est identique à votre code.
Notez que puisque vous n'utilisez pas vraiment une expression régulière ici, mais juste une valeur spécifique, vous pouvez tout aussi facilement utiliser:
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
Qui vérifie l'égalité des chaînes. Ceci équivaut à utiliser l'expression régulière /^smiths$/
, comme mentionné dans une autre réponse, qui inclut l' ^
ancre pour correspondre uniquement au début de la chaîne (le début du champ 1) et l' $
ancre pour ne faire correspondre que la fin de la chaîne. Vous ne savez pas à quel point vous êtes familier avec les regex. Ils sont très puissants, mais dans ce cas, vous pouvez utiliser un contrôle d’égalité de chaîne tout aussi facilement.
unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
Une autre approche consiste à utiliser des tableaux associatifs awk, plus d’informations ici . Cette ligne produit la sortie souhaitée:
Comme effet secondaire, le tableau stocke toutes les autres valeurs:
Sortie:
la source
Très bien jusqu'à présent. Tout ce que vous avez à faire est d’ajouter un sélecteur avant le bloc pour ajouter la somme. Nous vérifions ici que le premier argument ne contient que "forgerons":
Vous pouvez abréger un peu en spécifiant le séparateur de champs en option. C'est
awk
généralement une bonne idée d'initialiser des variables sur la ligne de commande:la source
-F
option pour spécifier le séparateur.$NF
est pour "dernière colonne".la source
cat
etgrep
sont inutiles ici./smiths/{...}
si l'appel de grep n'y est pas. Il s’agit d’une modification anodine, mais qui offre d’importants avantages: elle réduit le nombre de processus en cours, simplifie le contrôle des erreurs et rend le code plus clair.Personnellement, je préférerais que la
awk
section soit aussi simple que possible et que je fasse tout ce que vous pourrez sans elle. La logique intégrée ne tire pas parti de la puissance des pipelines Unix et est donc plus difficile à comprendre, à déboguer ou à modifier pour des cas d'utilisation étroitement liés.la source