← retour aux snippets

sort et uniq: compter occurrences rapidement

Compter, trier et dédupliquer des lignes de texte de façon fiable et performante.


objectif

Compter les occurrences, supprimer les doublons et extraire les éléments les plus fréquents à partir d’un flux de lignes (logs, emails, IP).

code minimal

# top 10 des lignes les plus fréquentes
sort | uniq -c | sort -nr | head -n 10

utilisation

# supprimer les doublons d'un fichier (résultat sur stdout)
sort -u emails.txt > emails_uniq.txt

# dédupliquer "in place" de manière sûre (sort crée un tmp puis remplace)
sort -u -o emails.txt emails.txt

# top 10 des IP les plus actives dans un access.log (colonne 1)
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

# comptage insensible à la casse (normaliser en minuscules)
tr '[:upper:]' '[:lower:]' < tags.txt | sort | uniq -c | sort -nr

# ne lister que les doublons (une fois chacun)
sort noms.txt | uniq -d

# ne lister que les lignes uniques (apparaissant une seule fois)
sort noms.txt | uniq -u

# compter précisément le nombre de lignes distinctes
sort -u data.txt | wc -l

variante(s) utile(s)

# accélérer fortement sur ASCII pur (logs, IDs)
LC_ALL=C sort | uniq -c | sort -nr

# intersection de deux fichiers (lignes communes, uniques)
comm -12 <(sort -u a.txt) <(sort -u b.txt)

# différence: lignes dans a.txt mais pas dans b.txt
comm -23 <(sort -u a.txt) <(sort -u b.txt)

# comparer sans tenir compte des espaces en fin/début
sed 's/^[[:space:]]\+//; s/[[:space:]]\+$//' data.txt | sort | uniq -c | sort -nr

# trier numériquement par la 3e colonne (ex: "clé valeur 42")
sort -k3,3n fichier.txt | uniq

notes

  • uniq ne détecte les doublons que si les lignes identiques sont adjacentes, d’où l’usage de sort en amont.
  • sort -u combine tri et déduplication plus efficacement que sort | uniq.
  • préférez LC_ALL=C pour des jeux de caractères ASCII (plus rapide et déterministe).
  • comm attend des entrées triées; les redirections de processus <( ... ) nécessitent Bash. Sur shells sans cette feature, utilisez des fichiers temporaires.