Vamos considerar como cada solução funciona.
-
uniqIsso requer que o arquivo já esteja classificado. Se não, você tem que passar porsortprimeiro, o que significa quesorttem 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 -uIsso 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 casonseja o número de itens exclusivos, não todos os insumos. Então é melhor que o tubo. -
sedNã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,sedestaria apenas fazendo o que ouniqfaz euniqprovavelmente o faria da forma mais eficiente possível. -
awkEsta é 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.