como se comparam as linhas?

0

Eu sempre assumi que, sortsem nenhum argumento adicional, classificaria 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 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 não-letras?) Ou casos especiais (como "uma sequência de um ou mais símbolos é igual a qualquer outra sequência de símbolos"?) Para comparar símbolos?

Eu li a manpágina, sortmas não encontrei nenhuma 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 uma análise mais aprofundada, que pressupõe ordenação lexical - há alguma opção que eu poderia passar sortpara conseguir isso?

qbolec
fonte
Eu realizei o mesmo teste no meu tipo Windows + Cygiwn (GNU coreutils) 8.15 Empacotado por Cygwin (8.15-1), e ele classifica lexicamente como esperado
qbolec

Respostas:

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.

GNU diz

A maioria das localidades específicas do idioma possui tabelas que especificam o comportamento de classificação para ignorar pontuação e para dividir maiúsculas e minúsculas. Isso é contra-intuitivo para a maioria dos usuários de computador de longa data!


NOTA

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

RedGrittyBrick
fonte