Comment supprimer les lignes en double dans un grand fichier texte de plusieurs Go?

16

Ma question est similaire à cette question mais avec quelques contraintes différentes:

  • J'ai une grande liste de \nmots délimitée - un mot par ligne. La taille des fichiers varie de 2 Go à 10 Go.
  • J'ai besoin de supprimer toutes les lignes en double.
  • Le processus peut trier la liste au cours de la suppression des doublons, mais n'est pas requis.
  • Il y a suffisamment d'espace sur la partition pour contenir la nouvelle liste de mots unique.

J'ai essayé ces deux méthodes mais elles échouent toutes les deux avec des erreurs de mémoire insuffisante.

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)

Quelles autres approches puis-je essayer?

grand loup
la source
Jetez un œil à une solution utilisant awk unix.stackexchange.com/a/30178/56820
ezdazuzena

Réponses:

18

Essayez d'utiliser le tri avec l' option -o/ --output=FILEau lieu de rediriger la sortie. Vous pouvez également essayer de définir le buffer-sizeavec -S/ --buffer-size=SIZE. Essayez également -s/ --stable. Et lisez la page de manuel, elle offre toutes les informations que j'ai données.

La commande complète que vous pouvez utiliser et qui pourrait fonctionner pour ce que vous faites:

sort -us -o wordlist_unique.lst wordlist.lst

Vous pouvez également lire l'URL suivante:

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

Cela explique plus en détail le tri que la page de manuel.

abat-jour
la source
merci pour la suggestion, malheureusement l'utilisation de --output ne résout toujours pas l'erreur de mémoire insuffisante. Courir ça me donne encore sort: write failed: /root/tmp/sortVxscLn: No space left on device. Le problème est un peu ennuyeux en ce qu'il n'échoue pas tout de suite. Il semble que vous deviez attendre que la mémoire soit épuisée avant de se tromper.
greatwolf
8
@Victor T .: Ce n'est pas une erreur de mémoire insuffisante, mais une erreur d'espace disque insuffisant. / Root est-il sur un système de fichiers différent de vos données? Si c'est le cas, utilisez l'option -T / - répertoire-temporaire sortpour utiliser un système de fichiers avec plus d'espace libre.
camh
@camh merci qui a fait l'affaire. Je ne savais pas que vous pouviez spécifier le tampon intermédiaire à utiliser.
greatwolf