Um enorme arquivo de texto (com até 2 GiB) contém cerca de 100 duplicatas exatas de cada linha (inútil no meu caso, pois o arquivo é uma tabela de dados semelhante a CSV).
O que eu preciso é remover todas as repetições enquanto (de preferência, mas isso pode ser sacrificado por um aumento significativo no desempenho), mantendo a ordem da sequência original. No resultado, cada linha deve ser única. Se houvesse 100 linhas iguais (geralmente as duplicatas estão espalhadas pelo arquivo e não serão vizinhas), resta apenas uma do tipo.
Eu escrevi um programa no Scala (considere Java se você não conhece o Scala) para implementar isso. Mas talvez haja ferramentas nativas escritas em C mais rápidas, capazes de fazer isso mais rapidamente?
ATUALIZAÇÃO: a awk '!seen[$0]++' filename
solução parecia estar funcionando bem para mim, desde que os arquivos estivessem perto de 2 GiB ou menores, mas agora como eu estou limpando um arquivo de 8 GiB, ele não funciona mais. Parece levar o infinito em um Mac com 4 GiB de RAM e um PC Windows 7 de 64 bits com 4 GiB de RAM e 6 GiB de swap fica sem memória. E não me sinto entusiasmado em experimentá-lo no Linux com 4 GiB de RAM, dada essa experiência.
sort -u
provavelmente será mais rápido.