Como posso classificar e remover uma lista muito longa de palavras?

2

Eu tenho um arquivo de 400 megabytes. O arquivo é uma lista de palavras, cada palavra em uma única linha. Fim das linhas são uma mistura de cr / lf e lf. Algumas das palavras são unicode.

Eu prefiro respostas para Linux ou Windows por favor. Estou feliz de instalar o software, mas eu prefiro o código aberto.

Eu preciso remover todas as palavras com menos de 8 caracteres. Então eu preciso desduplicar a lista. (Classificar a lista é bom, mas não é necessário, a menos que seja parte do processo.) Eu não me importo com as palavras unicode - elas podem ficar ou ir embora. Tirá-los é bom.

Para remover todas as palavras com 7 caracteres ou menos, uso o awk:

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

(Isto é o Windows, desculpe pelo "em vez de")

Eu então tento usar sort, porque eu posso usar o awk novamente para remover linhas. Ordenar não gostou da lista de palavras. Eu acho (mas não tenho certeza) que o unicode quebrou.

Então, como eu desduplico a lista de palavras? Ou como eu classifico a lista de palavras para que eu possa usar o awk para remover o dupe?

    
por DanBeale 31.08.2013 / 14:25

2 respostas

6

Para desduplicar, você precisa de sort -u - só produzirá linhas exclusivas. Esta é uma opção especificada pelo POSIX, então você provavelmente a encontrará em qualquer sistema.

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

Use aspas duplas para awk se você estiver no Windows. Observe que a etapa de classificação não é opcional, pois uniq requer que linhas duplicadas sejam adjacentes para removê-las.

Se você tiver problemas com Unicode, isso pode ser um problema de sua localidade. Você pode definir LC_ALL=C para forçar a comparação de valores de bytes nativos - a ordem de classificação real não importa para você de qualquer maneira. Ou você pode usar iconv para converter o arquivo de Unicode para outra codificação, se esse for o problema.

    
por 31.08.2013 / 14:34
3

Caso alguém precise fazer isso sem ter acesso a awk , você também pode usar grep para selecionar palavras de pelo menos um comprimento:

sort -u   wordlist.txt | grep '........'
    
por 31.08.2013 / 18:19