Supposons que j'ai un fichier similaire 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, la sortie serait comme:
123  3 
234  2 
345  1
Supposons que j'ai un fichier similaire 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, la sortie serait comme:
123  3 
234  2 
345  1
Réponses:
En supposant qu'il y a un numéro par ligne:
sort <file> | uniq -c
Vous pouvez également utiliser l' --countindicateur le plus verbeux avec la version GNU, par exemple sous Linux:
sort <file> | uniq --count
sortnouveau comme:sort <file> | uniq -c | sort -n
                    Cela imprimera uniquement les lignes en double , avec les nombres:
sort FILE | uniq -cd
ou, avec les options longues GNU (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 le nombre de toutes les lignes, y compris celles qui n'apparaissent qu'une seule fois:
sort FILE | uniq -c
ou, avec les options longues GNU (sous Linux):
sort FILE | uniq --count
Pour l'entrée donnée, la sortie est:
  3 123
  2 234
  1 345
Afin de trier la sortie avec les lignes les plus fréquentes en haut, vous pouvez faire ce qui suit (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
| sort -nou | sort -nrau tuyau triera la sortie par nombre de répétitions (croissant ou décroissant respectivement). Ce n'est pas ce que vous demandez, mais j'ai pensé que cela pourrait aider.
                    | awk '$1>100'
                    sort FILE | uniq -c | grep -v '^ *1 '
                    Via awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' dataDans la awk 'dups[$1]++'commande, la variable $1contient tout le contenu de la colonne1 et les crochets sont un accès au tableau. Ainsi, pour chaque 1ère colonne de ligne dans le datafichier, le nœud du tableau nommé dupsest incrémenté.
Et à la fin, nous bouclons sur le dupstableau avec numcomme variable et imprimons d'abord les nombres enregistrés puis leur nombre de valeurs dupliquées par dups[num].
Notez que votre fichier d'entrée a des espaces à la fin de certaines lignes, si vous les effacez, vous pouvez les utiliser $0à la place de la $1commande ci-dessus :)
uniq?
                    sort | uniqet la solution awk a des compromis de performances et de ressources assez différents: si les fichiers sont volumineux et que le nombre de lignes différentes est petit, la solution awk est beaucoup plus efficace. Il est linéaire dans le nombre de lignes et l'utilisation de l'espace est linéaire dans le nombre de lignes différentes. OTOH, la solution awk doit conserver toutes les différentes lignes en mémoire, tandis que le tri (GNU) peut recourir aux fichiers temporaires.
                    Dans les fenêtres 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 avez accès à 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 triez la sortie traduite et alimentez-la en uniq et comptez les lignes en double.