Ordenar comportamento inconsistente do comando

7

Eu quero classificar dois arquivos, mas não consigo obter resultados consistentes. Parece que há problemas com o agrupamento, mas não consigo entender o motivo. No separador de arquivos de amostra, existe um único espaço:

file1:

a
b
B
A

file2:

a 1
b 0
B 1
A 0

Eu uso sort -k1,1 para classificar esses arquivos e a saída é:

sorted1:

a
A
b
B

sorted2:

A 0
a 1
b 0
B 1

Eu preciso desses arquivos classificados em um join e atualmente ele está reclamando que o arquivo não está classificado.

No meu ambiente LC_COLLATE e LC_ALL não estão definidos, LANG está definido como en_US.UTF-8

Com LC_ALL=C sort -k1,1 , a saída é:

sorted11:

A
B
a
b

sorted22:

A 0
B 1
a 1
b 0

Não preciso de uma encomenda específica, apenas quero que possa juntar os resultados. Desta forma join funciona. Por segurança, também posso prefixar join com LC_ALL=C .

Minha pergunta

Por que em sorted1 a é anterior A e em sorted2 a é após A ? Qualquer que seja o agrupamento, ele é para os comandos sort e eu estou classificando com base na coluna 1 que é idêntica nos dois arquivos de entrada.

Adicionado saída de ltrace -e strcoll

file1

sort->strcoll("B","A") =1
sort->strcoll("a","b") =-1 
sort->strcoll("a","A") =-7
a
sort->strcoll("b","A") =1
A
sort->strcoll("b","B") =-7
b
B
+++ exited (status 0) +++

file2

sort->strcoll("B 1","A 0") =1
sort->strcoll("a 1","b 0") =-1 
sort->strcoll("a 1","A 0") =1
A 0
sort->strcoll("a 1","B 1) =-1
a 1
sort->strcoll("b 0","B 1") =-1
b 0
B 1
+++ exited (status 0) +++
    
por Ashkan 19.08.2015 / 11:45

2 respostas

2

Como Stéphane Chazelas disse no comentário , é um bug na implementação específica de coreutils (em coreutils-8.22-11.el7 ) pelo CentOS / Red Hat, mais especificamente no patch de internacionalização de bugs ( coreutils-i18n.patch ) que eles escreveram e aplicaram em cima do coreutils-8.22 do GNU.

Eu relatei aqui para o CentOS e também aqui para a Red Hat. Já era conhecido na Red Hat e corrigido em coreutils-8.22-13.el7 .

Esse ainda não está disponível para CentOS neste momento (2015-08- 20).

Para completar, note que o bug também foi (incorretamente como o bug não estava lá) relatado upstream (no GNU's), onde você encontrará mais informações sobre isso.

    
por 20.08.2015 / 12:01
0

Seu agrupamento padrão (en_US.UTF-8) causa isso. Você deve definir o valor LC_COLLATE para ordenar o texto conforme instruído.

 LC_COLLATE='C' sort -k1 file1
    
por 19.08.2015 / 13:00