Vous pouvez utiliser la commande sort
avec l'option --unique
:
sort -u input-file
Si vous souhaitez écrire le résultat dans FILE au lieu de la sortie standard, utilisez l'option --output=FILE
:
sort -u input-file -o output-file
La commande uniq
pourrait également être appliquée. Dans ce cas, les lignes identiques doivent être consécutives, donc l'entrée doit être triée préalablement - merci à @RonJohn pour cette note:
sort input-file | uniq > output-file
J'aime la sort
commande pour des cas similaires, en raison de sa simplicité, mais si vous travaillez avec de grands tableaux, l' awk
approche de la réponse de John1024 pourrait être plus puissante. Voici une comparaison temporelle entre les approches mentionnées, appliquées sur un fichier (basé sur l'exemple ci-dessus) de près de 5 millions de lignes:
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from αғsнιη's answer
64
0.770
Une autre différence significative est celle mentionnée par @Ruslan :
sort -u
imprimera uniquement le résultat une fois l'entrée terminée, tandis que cette awk
commande imprimera chaque nouvelle ligne de résultat à la volée (cela peut être plus important pour l'entrée canalisée que pour le fichier).
En voici une illustration:
Dans l'exemple ci-dessus, la boucle (illustrée ci-dessous) génère 500 combinaisons aléatoires, chacune d'une longueur de trois caractères, des lettres AD. Ces combinaisons sont dirigées vers awk
ou sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq
!!!!Si vous souhaitez conserver les lignes de sortie dans le même ordre que les lignes d'entrée, utilisez:
Comment ça fonctionne:
Cela utilise un tableau associatif
a
pour compter le nombre de fois où chaque ligne a été vue précédemment. S'il n'a pas été vu auparavant, la ligne est imprimée.la source
awk
, maissort -u
c'est le moyen facile.sort -u
aussi le chemin le plus lent :) J'ai mis à jour ma réponse avec une comparaison temporelle entre les deux approches.sort -u
n'imprimera le résultat qu'une fois l'entrée terminée, tandis que cetteawk
commande imprimera chaque nouvelle ligne de résultat à la volée (cela peut être plus important pour l'entrée canalisée que pour le fichier).awk
solution est très bonne, mais pas aussi facile à lire quesort
.Vous pouvez également utiliser GNU
datamash
ici comme suit et conserver l'ordre des lignes.la source
time
comparaison, c'est la solution la plus rapide, fournie ici.