Você pode usar o comando sort
com a opção --unique
:
sort -u input-file
Se você quiser 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 uniq
também pode ser aplicado. Neste caso, as linhas idênticas devem ser consequentes, portanto a entrada deve ser classificada preliminarmente - graças a @RonJohn por esta nota:
sort input-file | uniq > output-file
Eu gosto do comando sort
para casos semelhantes, devido à sua simplicidade, mas se você trabalha com grandes matrizes, a abordagem awk
de John1024's answer poderia ser mais poderoso. 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 é que mencionado por @Ruslan :
sort -u
will only print the result once the input has ended, while thisawk
command will do print each new result line on the fly (this may be more important for piped input than file).
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 A-D. Essas combinações são canalizadas para awk
ou sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done