GNU/Linux >> Tutoriels Linux >  >> Linux

Utiliser awk pour additionner les valeurs d'une colonne, en fonction des valeurs d'une autre colonne

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}'

Linux
  1. Dépannage à l'aide du système de fichiers proc sous Linux

  2. Utiliser awk pour imprimer toutes les colonnes de la nième à la dernière

  3. Ajouter une colonne à la fin du fichier CSV en utilisant 'awk' dans le script BASH

  4. utiliser awk avec des conditions de valeur de colonne

  5. Déplacer une installation Linux à l'aide de btrfs sur le sous-volume par défaut (subvolid=0) vers un autre sous-volume

Utilisation de la commande gratuite Linux

Utilisation du fichier de configuration SSH

Tutoriel sur l'utilisation de la commande Timeout sous Linux

Linux - Ajouter une colonne à un CSV qui est la somme des deux colonnes précédentes ?

Encore un autre résolveur de puzzle Sudoku utilisant AWK

Utilisation d'AWK pour sélectionner des lignes avec une valeur spécifique dans une colonne spécifique