como se comparam as linhas?

0

Eu sempre assumi que sort sem nenhum argumento adicional, irá classificar um arquivo em ordem lexical. No entanto, hoje eu me deparei com o seguinte caso de teste:

sort test2.txt
a/a
a/c
a//c
a/d

Como você pode ver, a terceira linha tem duas barras, então a segunda barra está em um lugar onde as linhas vizinhas têm as letras 'c' e 'd', respectivamente. Eu duvido que '/' fique entre 'c' e 'd' em qualquer página de código, então eu acho que o algoritmo de comparação padrão não é estritamente léxico.

Existe algum pré-processamento (como remover letras sem letras?) ou casos especiais (como "uma sequência de um ou mais símbolos é igual a qualquer outra seqüência de símbolos"?) para comparar símbolos?

Eu li man page por sort mas não encontrei iluminação lá.

eu uso

sort --version
sort (GNU coreutils) 8.5
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.

e eu realmente preciso classificar milhões de URLs para análise posterior, o que pressupõe ordenação lexical - há alguma opção que eu possa passar para sort para conseguir isso?

    
por qbolec 11.09.2014 / 10:52

1 resposta

3

É sua localidade, prefixar seu comando sort com uma configuração de localidade que especifica a ordem de agrupamento desejada

$ cat test2.txt
a/d
a/a
a/c
a//c

$ sort test2.txt
a/a
a/c
a//c
a/d

$ LANG=C sort test2.txt
a//c
a/a
a/c
a/d

man sort diz

   *** WARNING *** The locale specified by the  environment  affects  sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

O GNU diz

Most of the language specific locales have tables that specify the sort behavior to ignore punctuation and to fold case. This is counter intuitive to most long time computer users!

NOTA

Se seus milhões de URLs contiverem caracteres não-ASCII (o que os tornaria realmente IRIs ), você poderá ser indesejado resultados usando uma classificação de valor de byte. Você pode usar codificação de URL para evitar esse problema, com o risco de tornar os URLs difíceis para os humanos lerem. / p>     

por 11.09.2014 / 11:29