¿Cómo eliminar líneas duplicadas en un gran archivo de texto de varios GB?

16

Mi pregunta es similar a esta pregunta pero con un par de restricciones diferentes:

  • Tengo una gran \nlista de palabras delimitadas: una palabra por línea. El tamaño de los archivos varía de 2 GB a 10 GB.
  • Necesito eliminar cualquier línea duplicada.
  • El proceso puede ordenar la lista durante el transcurso de la eliminación de los duplicados, pero no es obligatorio.
  • Hay suficiente espacio en la partición para contener la nueva lista de palabras única que se genera.

He intentado ambos métodos, pero ambos fallan con errores de falta de memoria.

sort -u wordlist.lst > wordlist_unique.lst
awk '!seen[$0]++' wordlist.lst > wordlist_unique.lst
awk: (FILENAME=wordlist.lst FNR=43601815) fatal: assoc_lookup: bucket-ahname_str: can't allocate 10 bytes of memory (Cannot allocate memory)

¿Qué otros enfoques puedo probar?

gran lobo
fuente
Eche un vistazo a una solución usando awk unix.stackexchange.com/a/30178/56820
ezdazuzena

Respuestas:

18

Intente usar ordenar con la opción -o/ en --output=FILElugar de redirigir la salida. También puede intentar configurarlo buffer-sizecon -S/ --buffer-size=SIZE. Además, intente -s/ --stable. Y lea la página del manual, ofrece toda la información que le di.

El comando completo que puede usar que podría funcionar para lo que está haciendo:

sort -us -o wordlist_unique.lst wordlist.lst

También es posible que desee leer la siguiente URL:

http://www.gnu.org/s/coreutils/manual/html_node/sort-invocation.html

Eso explica más a fondo el tipo que la página de manual.

sombreador
fuente
gracias por la sugerencia, desafortunadamente usando --output todavía no soluciona el error de falta de memoria. Correr eso todavía me da sort: write failed: /root/tmp/sortVxscLn: No space left on device. El problema es un poco molesto porque no falla de inmediato. Parece que tiene que esperar a que la memoria se agote antes de que se produzca un error.
greatwolf
8
@Victor T .: Eso no es un error de falta de memoria, sino un error de falta de espacio en disco. ¿Está / root en un sistema de archivos diferente a sus datos? Si es así, use la opción -T / - directorio-temporal sortpara usar un sistema de archivos con más espacio libre.
camh
@camh gracias que hizo el truco. No me di cuenta de que podía especificar qué buffer intermedio usar.
greatwolf