Un enorme archivo de texto mío (hasta 2 GiB) contiene alrededor de 100 duplicados exactos de cada línea (inútil en mi caso, ya que el archivo es una tabla de datos similar a CSV).
Lo que necesito es eliminar todas las repeticiones mientras (preferiblemente, pero esto se puede sacrificar por un aumento significativo del rendimiento) manteniendo el orden de la secuencia original. En el resultado, cada línea debe ser única. Si hubiera 100 líneas iguales (por lo general, los duplicados se distribuyen por todo el archivo y no serán vecinos), solo quedará una de ese tipo.
He escrito un programa en Scala (considéralo Java si no conoces Scala) para implementar esto. ¿Pero tal vez hay herramientas nativas escritas en C más rápidas que pueden hacer esto más rápido?
ACTUALIZACIÓN:el nombre de archivo awk '!seen[$0]++' filename
La solución parecía funcionar bien para mí siempre que los archivos estuvieran cerca de 2 GiB o menos, pero ahora que tengo que limpiar un archivo de 8 GiB, ya no funciona. Parece tomar el infinito en una Mac con 4 GiB de RAM y una PC con Windows 7 de 64 bits con 4 GiB de RAM y 6 GiB de intercambio, simplemente se queda sin memoria. Y no me entusiasma probarlo en Linux con 4 GiB de RAM dada esta experiencia.
Respuesta aceptada:
Un awk
solución vista en #bash (Freenode):
awk '!seen[$0]++' filename