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

Supposons que je possède un fichier similaire à celui-ci:

123 123 234 234 123 345 

J’aimerais savoir combien de fois “123” a été dupliqué, combien de fois “234” a été dupliqué, etc. Donc, idéalement, le résultat serait comme:

 123 3 234 2 345 1 

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

 sort  | uniq -c 

Vous pouvez aussi utiliser le drapeau plus verbeux --count avec la version GNU, par exemple sous Linux:

 sort  | uniq --count 

Cela imprimera des lignes en double seulement , avec des comptes:

 sort FILE | uniq -cd 

ou, avec les options GNU Long (sous Linux):

 sort FILE | uniq --count --repeated 

sur 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 des comptes pour toutes les lignes, y compris celles qui apparaissent une seule fois:

 sort FILE | uniq -c 

ou, avec les options GNU Long (sous Linux):

 sort FILE | uniq --count 

Pour l’entrée donnée, la sortie est la suivante:

  3 123 2 234 1 345 

Pour sortinger la sortie avec les lignes les plus fréquentes, vous pouvez effectuer les opérations suivantes (pour obtenir tous les résultats):

 sort FILE | uniq -c | sort -nr 

ou, pour obtenir uniquement des lignes en double, les plus fréquentes en premier:

 sort FILE | uniq -cd | sort -nr 

sur OSX et BSD le dernier devient:

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

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

 sort  | uniq -c | sort -nr 

ou:

 cat  | sort | uniq -c | sort -nr 

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 colonne 1 et les crochets sont accessibles par tableau. Ainsi, pour chaque première colonne de ligne du fichier de data , le nœud du tableau nommé dups est incrémenté.

Et à la fin, nous passons en boucle sur le tableau des dups avec num comme variable et imprimons d’abord les numéros enregistrés puis leur nombre de 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 🙂

Dans Windows en 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 aussi utiliser la cmdlet where-object pour filtrer le résultat

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

En supposant que vous ayez access à un shell Unix standard et / ou à un environnement cygwin:

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

Fondamentalement: convertissez tous les caractères d'espace en sauts de ligne, puis sortingez la sortie tranlated et transmettez-la à uniq et comptez les lignes en double.

Si quelqu’un cherche le site Web en ligne qui fait le même travail:

http://www.kennistranslations.com/wordcount