web-dev-qa-db-fra.com

Trouver des lignes en double dans un fichier et compter combien de fois chaque ligne a été dupliquée?

Supposons que j'ai un fichier semblable au suivant:

123 
123 
234 
234 
123 
345

Je voudrais savoir combien de fois "123" a été dupliqué, combien de fois "234" a été dupliqué, etc. Donc, idéalement, le résultat devrait être le suivant:

123  3 
234  2 
345  1
465
user839145

En supposant qu'il y ait un numéro par ligne:

sort <file> | uniq -c

Vous pouvez également utiliser le drapeau plus détaillé --count avec la version GNU, par exemple sous Linux:

sort <file> | uniq --count
715
wonk0

Ceci imprimera les lignes en double uniquement , avec des comptes:

sort FILE | uniq -cd

ou, avec GNU longues options (sous Linux):

sort FILE | uniq --count --repeated

on BSD et OSX, vous devez utiliser grep pour filtrer les lignes uniques:

sort FILE | uniq -c | grep -v '^ *1 '

Pour l'exemple donné, le résultat serait:

  3 123
  2 234

Si vous souhaitez imprimer le compte de toutes les lignes , y compris celles qui apparaissent une seule fois:

sort FILE | uniq -c

ou, avec GNU longues options (sous Linux):

sort FILE | uniq --count

Pour l'entrée donnée, la sortie est:

  3 123
  2 234
  1 345

Pour trier la sortie avec les lignes les plus fréquentes en haut, vous pouvez procéder comme suit (pour obtenir tous les résultats):

sort FILE | uniq -c | sort -nr

ou, pour obtenir uniquement les lignes en double, le plus fréquent en premier:

sort FILE | uniq -cd | sort -nr

sur OSX et BSD, le dernier devient:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
369
Andrea

Pour rechercher et compter les lignes en double dans plusieurs fichiers, vous pouvez essayer la commande suivante:

sort <files> | uniq -c | sort -nr

ou:

cat <files> | sort | uniq -c | sort -nr
70
kenorb

Via awk :

awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data

Dans la commande awk 'dups[$1]++', la variable $1 contient l'intégralité du contenu de la colonne1 et les crochets indiquent un accès au tableau. Ainsi, pour chaque 1ère colonne de ligne du fichier data, le nœud du tableau nommé dups est incrémenté.

Et à la fin, nous parcourons dups tableau avec num comme variable et affichons les nombres enregistrés en premier, puis leur numéro. de la valeur dupliquée par dups[num].

Notez que votre fichier d'entrée comporte des espaces à la fin de certaines lignes. Si vous les effacez, vous pouvez utiliser $0 à la place de $1 dans la commande ci-dessus :)

28
αғsнιη

Dans Windows utilisant "Windows PowerShell" J'ai utilisé la commande mentionnée ci-dessous pour y parvenir

Get-Content .\file.txt | Group-Object | Select Name, Count

Nous pouvons également utiliser l'applet de commande where-object pour filtrer le résultat.

Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
12
vineel

En supposant que vous ayez accès à un environnement Unix Shell et/ou cygwin standard:

tr -s ' ' '\n' < yourfile | sort | uniq -d -c
       ^--space char

Fondamentalement: convertissez tous les caractères d'espace en sauts de ligne, puis triez la sortie traduite et alimentez-la en uniq et comptez les lignes en double.

6
Marc B