È possibile utilizzare il comando sortcon l'opzione --unique:
sort -u input-file
Se si desidera scrivere il risultato su FILE anziché sull'output standard, utilizzare l'opzione --output=FILE:
sort -u input-file -o output-file
Il comando uniqpotrebbe anche essere applicato. In questo caso le linee identiche devono essere consequenziali, quindi l'input deve essere ordinato preliminare - grazie a @RonJohn per questa nota:
sort input-file | uniq > output-file
Mi piace il sortcomando per casi simili, per la sua semplicità, ma se lavori con array di grandi dimensioni l' awkapproccio della risposta di John1024 potrebbe essere più potente. Ecco un confronto temporale tra gli approcci citati, applicato su un file (basato sull'esempio sopra) con quasi 5 milioni di righe:
$ 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
Un'altra differenza significativa è quella menzionata da @Ruslan :
sort -ustamperà il risultato solo quando l'input è terminato, mentre questo awkcomando stampa al volo ogni nuova linea di risultato (questo può essere più importante per l'input con piping rispetto al file).
Ecco un'illustrazione:

Nell'esempio sopra, il loop (mostrato sotto) genera 500 combinazioni casuali, ciascuna con una lunghezza di tre caratteri, delle lettere AD. Queste combinazioni vengono reindirizzate a awko sort.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done