Você pode usar o comando sort
com 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 uniq
també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 sort
comando para casos semelhantes, devido à sua simplicidade, mas se você trabalha com matrizes grandes, a awk
abordagem 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 -u
somente imprimirá o resultado quando a entrada terminar, enquanto esse awk
comando 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 awk
ou sort
.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq
!!!!Se você deseja manter as linhas de saída na mesma ordem que as linhas de entrada, use:
Como funciona:
Isso usa uma matriz associativa
a
para contar o número de vezes que cada linha foi vista anteriormente. Se não tiver sido visto anteriormente, a linha será impressa.fonte
awk
, massort -u
é o caminho mais fácil.sort -u
também é o caminho mais lento :) Atualizei minha resposta com uma comparação de tempo entre as duas abordagens.sort -u
apenas imprimirá o resultado após o término da entrada, enquanto esteawk
comando imprimirá cada nova linha de resultado rapidamente (isso pode ser mais importante para a entrada canalizada do que para o arquivo).awk
solução é muito boa, embora não seja tão fácil de ler quantosort
.Você pode usar o GNU
datamash
aqui também da seguinte forma e manterá a ordem das linhas.fonte
time
comparação, esta é a solução mais rápida, fornecida aqui.