Come rimuovere le linee duplicate in un grande file di testo multi-GB?


16

La mia domanda è simile a questa domanda ma con un paio di vincoli diversi:

  • Ho un grande \nelenco di parole delimitate - una parola per riga. Le dimensioni dei file vanno da 2 GB a 10 GB.
  • Devo rimuovere eventuali righe duplicate.
  • Il processo può ordinare l'elenco nel corso della rimozione dei duplicati ma non è necessario.
  • C'è abbastanza spazio sulla partizione per contenere il nuovo elenco di parole univoco emesso.

Ho provato entrambi questi metodi ma entrambi falliscono con errori di memoria insufficiente.

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)

Quali altri approcci posso provare?


Risposte:


18

Prova a utilizzare l'ordinamento con l' opzione -o/ --output=FILEinvece di reindirizzare l'output. Potresti anche provare a impostare il buffer-sizecon -S/ --buffer-size=SIZE. Inoltre, prova -s/ --stable. E leggi la pagina man, offre tutte le informazioni che ho dato.

Il comando completo che puoi usare che potrebbe funzionare per quello che stai facendo:

sort -us -o wordlist_unique.lst wordlist.lst

Potresti anche voler leggere il seguente URL:

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

Questo spiega più a fondo l'ordinamento della pagina man.


grazie per il suggerimento, purtroppo usando --output non risolve ancora l'errore di memoria insufficiente. Correre che mi dà ancora sort: write failed: /root/tmp/sortVxscLn: No space left on device. Il problema è un po 'fastidioso in quanto non fallisce subito. Sembra che devi aspettare che la memoria si esaurisca prima che si esaurisca.
greatwolf,

8
@Victor T .: Non si tratta di un errore di memoria esaurita, ma di spazio su disco insufficiente. / Root è su un file system diverso dai tuoi dati? In tal caso, utilizzare l'opzione -T / - temporary-directory sortper utilizzare un filesystem con più spazio libero.
Camh,

@camh grazie che ha funzionato. Non avevo capito che potresti specificare quale buffer intermedio usare.
greatwolf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.