Vous pouvez utiliser la commande sortavec 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 uniqpourrait é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 sortcommande pour des cas similaires, en raison de sa simplicité, mais si vous travaillez avec de grands tableaux, l' awkapproche 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 -uimprimera uniquement le résultat une fois l'entrée terminée, tandis que cette awkcommande 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 awkou sort.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done