Вы можете использовать команду sortс опцией --unique:
sort -u input-file
Если вы хотите записать результат в FILE вместо стандартного вывода, используйте опцию --output=FILE:
sort -u input-file -o output-file
Команда uniqтакже может быть применена. В этом случае идентичные строки должны быть последовательными, поэтому входные данные должны быть предварительно отсортированы - спасибо @RonJohn за эту заметку:
sort input-file | uniq > output-file
Мне нравится sortкоманда для подобных случаев из-за ее простоты, но если вы работаете с большими массивами, awkподход из ответа John1024 может быть более мощным. Вот сравнение времени между упомянутыми подходами, примененными к файлу (на основе приведенного выше примера) с почти 5 миллионами строк:
$ 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
Другое существенное отличие заключается в том, что упомянуто @Ruslan :
sort -uбудет печатать результат только после завершения ввода, в то время как эта awkкоманда будет печатать каждую новую строку результатов на лету (это может быть важнее для ввода по каналу, чем для файла).
Вот иллюстрация:

В приведенном выше примере цикл (показан ниже) генерирует 500 случайных комбинаций, каждая из которых имеет длину три символа, из букв AD. Эти комбинации передаются по трубопроводу awkили sort.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done