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
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
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
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
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 :)
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
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.