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