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:
Vous pouvez également utiliser l'
--count
indicateur le plus verbeux avec la version GNU, par exemple sous Linux:la source
sort
nouveau comme:sort <file> | uniq -c | sort -n
Cela imprimera uniquement les lignes en double , avec les nombres:
ou, avec les options longues GNU (sous Linux):
sur BSD et OSX, vous devez utiliser grep pour filtrer les lignes uniques:
Pour l'exemple donné, le résultat serait:
Si vous souhaitez imprimer le nombre de toutes les lignes, y compris celles qui n'apparaissent qu'une seule fois:
ou, avec les options longues GNU (sous Linux):
Pour l'entrée donnée, la sortie est:
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):
ou, pour obtenir uniquement des lignes en double, les plus fréquentes en premier:
sur OSX et BSD, le dernier devient:
la source
| sort -n
ou| sort -nr
au 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 '
Pour rechercher et compter les lignes en double dans plusieurs fichiers, vous pouvez essayer la commande suivante:
ou:
la source
Via awk:
Dans la
awk 'dups[$1]++'
commande, la variable$1
contient tout le contenu de la colonne1 et les crochets sont un accès au tableau. Ainsi, pour chaque 1ère colonne de ligne dans ledata
fichier, le nœud du tableau nommédups
est incrémenté.Et à la fin, nous bouclons sur le
dups
tableau avecnum
comme variable et imprimons d'abord les nombres enregistrés puis leur nombre de valeurs dupliquées pardups[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$1
commande ci-dessus :)la source
uniq
?sort | uniq
et 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
Nous pouvons également utiliser l'applet de commande where-object pour filtrer le résultat
la source
En supposant que vous avez accès à un shell Unix standard et / ou à un environnement cygwin:
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.
la source