Vamos considerar como cada solução funciona.
-
uniq
Isso requer que o arquivo já esteja classificado. Se não, você tem que passar porsort
primeiro, o que significa quesort
tem que ler todo o arquivo na memória, reordená-lo (O(n log n)
) e, em seguida, gravá-lo no pipe. O trabalho deuniq
é muito barato, pois só tem que comparar linhas adjacentes de sua entrada. -
sort -u
Isso combina o trabalho desort | uniq
. Isso tem que coletar todas as entradas únicas na memória como o scriptawk
, mas também desperdiça tempo classificando-as antes de produzir a saída. Isso éO(n log n)
, embora nesse cason
seja o número de itens exclusivos, não todos os insumos. Então é melhor que o tubo. -
sed
Não sei por que você listou isso, pois não consigo pensar em uma boa maneira de fazer isso comsed
. Talvez se você primeiro classificar e canalizar para um scriptsed
, há uma maneira de comparar linhas adjacentes. Portanto,sed
estaria apenas fazendo o que ouniq
faz euniq
provavelmente o faria da forma mais eficiente possível. -
awk
Esta é provavelmente a melhor, porque só faz a quantidade mínima de trabalho necessária. À medida que lê cada linha, faz uma pesquisa de hash eficiente para ver se a linha já está em sua memória e armazena apenas as linhas exclusivas como chaves hash e um contador como o valor. (Se a linha não estava presente anteriormente, a condição será verdadeira, então a linha será impressa. Caso contrário, não será.) Isso usaO(n)
time eO(uniq n)
memory.
Todo método usará uma quantidade considerável de memória, seja para ordenar a entrada ou para controlar quais entradas viram, para que possam remover duplicatas.