È possibile utilizzare il comando sort
con 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 uniq
potrebbe 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 sort
comando per casi simili, per la sua semplicità, ma se lavori con array di grandi dimensioni l' awk
approccio 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 -u
stamperà il risultato solo quando l'input è terminato, mentre questo awk
comando 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 awk
o sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done