Você pode usar o comando sortcom a opção --unique:
sort -u input-file
Se você deseja gravar o resultado em FILE em vez da saída padrão, use a opção --output=FILE:
sort -u input-file -o output-file
O comando uniqtambém pode ser aplicado. Nesse caso, as linhas idênticas devem ser consequenciais; portanto, a entrada deve ser classificada preliminarmente - graças a @RonJohn para esta observação:
sort input-file | uniq > output-file
Gosto do sortcomando para casos semelhantes, devido à sua simplicidade, mas se você trabalha com matrizes grandes, a awkabordagem da resposta de John1024 pode ser mais poderosa. Aqui está uma comparação de tempo entre as abordagens mencionadas, aplicada em um arquivo (com base no exemplo acima) com quase 5 milhões de linhas:
$ 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
Outra diferença significativa é a mencionada por @Ruslan :
sort -usomente imprimirá o resultado quando a entrada terminar, enquanto esse awkcomando imprimirá cada nova linha de resultado rapidamente (isso pode ser mais importante para a entrada canalizada do que para o arquivo).
Aqui está uma ilustração:

No exemplo acima, o loop (mostrado abaixo) gera 500 combinações aleatórias, cada uma com um comprimento de três caracteres, das letras AD. Essas combinações são canalizadas para awkou sort.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done