Comment puis-je trier et dupliquer une très longue liste de mots?

2

J'ai un fichier de 400 mégaoctets. Le fichier est une liste de mots, chaque mot sur une seule ligne. Les fins de lignes sont un mélange de cr / lf et de lf. Certains mots sont unicode.

Je préférerais des réponses pour Linux ou Windows s'il vous plaît. Je suis heureux d'installer un logiciel, mais je préférerais open source.

Je dois supprimer tous les mots de moins de 8 caractères. J'ai ensuite besoin de dédoubler la liste. (Trier la liste est agréable, mais pas nécessaire sauf si cela fait partie du processus.) Je me fiche des mots unicode - ils peuvent rester ou disparaître. Les dépouiller, c'est bien.

Pour supprimer tous les mots de 7 caractères ou moins, j'utilise awk:

awk "length($0) > 7" wordlist.txt > mynewwordlist.txt

(Ceci est Windows, désolé pour le "au lieu de ')

J'essaie ensuite d'utiliser le tri, car je peux alors utiliser à nouveau awk pour réduire les lignes. Sort n'a pas aimé la liste de mots. Je pense (mais je ne suis pas sûr) que l'unicode l'a cassé.

Alors, comment puis-je dupliquer la liste de mots? Ou comment puis-je trier la liste de mots afin que je puisse utiliser awk pour réduire le problème?

DanBeale
la source

Réponses:

6

Pour déduire, vous devez sort -u - il ne produira que des lignes uniques. Ceci est une option spécifiée par POSIX, vous la trouverez donc probablement sur n’importe quel système.

sort -u wordlist.txt | awk 'length($0) > 7'

Utilisez des guillemets doubles pour awk si vous êtes sous Windows. Notez que l’étape de tri n’est pas facultative, car uniq nécessite que les lignes en double soient adjacentes pour pouvoir les supprimer.

Si vous avez des problèmes Unicode, cela pourrait être un problème de vos paramètres régionaux. Vous pouvez définir LC_ALL=C forcer la comparaison de la valeur d'octet natif - de toute façon, l'ordre de tri n'a pas d'importance pour vous. Ou, vous pouvez utiliser iconv convertir le fichier Unicode en un autre encodage si tel est le problème.

slhck
la source
sorte a un -u ( --unique ), au moins sur cygwin.
Nifle
Tu as raison, je pensais que ce n'était pas POSIX, va corriger mon post!
slhck
3

Au cas où quelqu'un aurait besoin de le faire sans avoir accès à awk, vous pouvez aussi utiliser grep pour sélectionner des mots d'au moins une longueur donnée:

sort -u   wordlist.txt | grep '........'
terdon
la source
Cool bidouille. Je n'aurais pas pensé à faire quelque chose comme ça.
davidgo