awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
- Le
-F
flag définit le séparateur de champs ; Je l'ai mis entre guillemets simples car c'est un caractère shell spécial. - Puis
$1 ~ /smiths/
applique le {code block} 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, juste une valeur spécifique, vous pouvez tout aussi bien utiliser :
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
Qui vérifie l'égalité des chaînes. Cela équivaut à utiliser la regex /^smiths$/
, comme mentionné dans une autre réponse, qui inclut le ^
ancre pour ne faire correspondre que le début de la chaîne (le début du champ 1) et le $
ancre pour correspondre uniquement à 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 tout aussi facilement utiliser une vérification de l'égalité des chaînes.
Une autre approche consiste à utiliser des tableaux associatifs awk, plus d'informations ici. Cette ligne produit la sortie souhaitée :
awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt
Comme effet secondaire, le tableau stocke toutes les autres valeurs :
awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt
Sortie :
smiths 212
denniss 100
olivert 10
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. Ici on vérifie que le premier argument ne contient que "smiths":
awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'
Vous pouvez raccourcir un peu cela en spécifiant le séparateur de champs en option. En awk
c'est généralement une bonne idée d'initialiser les variables sur la ligne de commande :
awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'