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) +++