Por que a ordenação padrão produz resultados diferentes com o mesmo início de linha? [duplicado]

2

Estou usando sort no bash, mas recebendo pedidos diferentes para dois arquivos, mesmo que o primeiro conjunto de caracteres seja o mesmo.

arquivo1:

  "(0, -11)": "(-1.24636393592-0.992799153308j)", 
  "(0, 1)": "(149.807097864-5.44350795193j)", 
  "(0, 0)": "(17.1604053672+3.88079235934j)", 
  "(0, 11)": "(-1.59903812426-0.923768768117j)", 
  "(0, -1)": "(47.1824114723-21.6682255934j)", 
  "(0, 10)": "(-7.9306816865-1.40521728962j)", 
  "(0, 12)": "(-1.01650580426-1.04187674309j)", 
  "(0, -10)": "(-0.901802059305-0.821904477534j)", 

arquivo2:

  "(0, 0)": "(0.581223595766+0.883221459338j)", 
  "(0, -1)": "(0.0296256019162+0.632637319226j)", 
  "(0, -10)": "(0.792520325166+0.141433946136j)", 
  "(0, 10)": "(-1.20153329399-0.805695804956j)", 
  "(0, 1)": "(0.285821897179-0.508323457505j)", 
  "(0, 11)": "(0.0402120404586-1.57660120897j)", 
  "(0, -11)": "(0.476001913928+0.127280670816j)", 
  "(0, 12)": "(-0.257439911355-1.2545061217j)",

sort file1 dá:

  "(0, 0)": "(17.1604053672+3.88079235934j)", 
  "(0, -10)": "(-0.901802059305-0.821904477534j)", 
  "(0, 10)": "(-7.9306816865-1.40521728962j)", 
  "(0, -11)": "(-1.24636393592-0.992799153308j)", 
  "(0, 11)": "(-1.59903812426-0.923768768117j)", 
  "(0, 1)": "(149.807097864-5.44350795193j)", 
  "(0, 12)": "(-1.01650580426-1.04187674309j)", 
  "(0, -1)": "(47.1824114723-21.6682255934j)", 

sort file2 dá:

  "(0, 0)": "(0.581223595766+0.883221459338j)", 
  "(0, -1)": "(0.0296256019162+0.632637319226j)", 
  "(0, -10)": "(0.792520325166+0.141433946136j)", 
  "(0, 10)": "(-1.20153329399-0.805695804956j)", 
  "(0, 1)": "(0.285821897179-0.508323457505j)", 
  "(0, 11)": "(0.0402120404586-1.57660120897j)", 
  "(0, -11)": "(0.476001913928+0.127280670816j)", 
  "(0, 12)": "(-0.257439911355-1.2545061217j)", 

Similarmente, sort file1 file2 fornece uma lista que parece não estar ordenada, alfabeticamente, numericamente ou de outra forma.

Eu esperaria que o padrão fizesse uma classificação alfabética - que compara um caractere por vez. As listas devem ser totalmente classificáveis, sem nunca chegar ao décimo caractere em que elas começam a diferir, então por que recebo ordens diferentes quando as organizo?

EDIT 1 O uso de sinalizadores numéricos -g ou -n ainda fornece resultados inconsistentes.

A classificação pelo primeiro campo funciona como esperado, por ex. sort <(cat file1 file2 | cut -f1 -d':')

EDIT 2 Para uma resposta à minha pergunta, veja a resposta aceita.

A solução para o meu problema (inspirada na resposta abaixo) parece ser:

LC_ALL=C sort file1
LC_ALL=C sort file2

Isso faz um tipo de byte-wise. Eu não me importo com a ordem de classificação, contanto que dois arquivos com o mesmo conteúdo acabem na mesma ordem, e acho que isso é o suficiente.

EDIT 3

Esta não é uma duplicata da outra questão. Não estou a perguntar nada sobre a ordenação < < colchetes. Sim, a resposta se aplica. Há uma diferença entre perguntas duplicadas e perguntas separadas às quais a mesma resposta ampla pode ser aplicada. A chave aqui é que eu (e possivelmente outros com a minha pergunta) não teria encontrado a outra questão enquanto procurava o problema que estou tendo.

TLDR; Eles não são perguntas duplicadas - apenas perguntas relacionadas e respostas relacionadas. Eles devem estar "ligados". Não marcado em duplicado.

    
por argentum2f 18.05.2018 / 18:58

1 resposta

3

A classificação segue as regras de intercalação, que são selecionadas pela definição de localidade LC_COLLATE (ou LC_ALL, se configurada, voltando a LANG quando ambas não estão definidas). A lógica por trás disso é óbvia - diferentes idiomas têm regras diferentes para ordenação alfabética.

Aparentemente, o agrupamento do idioma de sua escolha pula os "-" s.

$ LC_COLLATE=en_DK sort file2
"(0, 0)": "(0.581223595766+0.883221459338j)", 
"(0, -1)": "(0.0296256019162+0.632637319226j)", 
"(0, -10)": "(0.792520325166+0.141433946136j)", 
"(0, 10)": "(-1.20153329399-0.805695804956j)", 
"(0, 1)": "(0.285821897179-0.508323457505j)", 
"(0, 11)": "(0.0402120404586-1.57660120897j)", 
"(0, -11)": "(0.476001913928+0.127280670816j)", 
"(0, 12)": "(-0.257439911355-1.2545061217j)", 

$ LC_COLLATE=C sort file2
"(0, -1)": "(0.0296256019162+0.632637319226j)", 
"(0, -10)": "(0.792520325166+0.141433946136j)", 
"(0, -11)": "(0.476001913928+0.127280670816j)", 
"(0, 0)": "(0.581223595766+0.883221459338j)", 
"(0, 1)": "(0.285821897179-0.508323457505j)", 
"(0, 10)": "(-1.20153329399-0.805695804956j)", 
"(0, 11)": "(0.0402120404586-1.57660120897j)", 
"(0, 12)": "(-0.257439911355-1.2545061217j)", 
    
por 18.05.2018 / 20:08

Tags