排序命令不一致的行为

a5h*_*5hk 9 centos sort locale

我想对两个文件进行排序,但无法获得一致的结果。排序规则似乎存在问题,但我无法理解原因。在示例文件中,分隔符是一个空格:

文件 1:

a
b
B
A
Run Code Online (Sandbox Code Playgroud)

文件2:

a 1
b 0
B 1
A 0
Run Code Online (Sandbox Code Playgroud)

sort -k1,1用来对这些文件进行排序,输出是:

排序 1:

a
A
b
B
Run Code Online (Sandbox Code Playgroud)

排序2:

A 0
a 1
b 0
B 1
Run Code Online (Sandbox Code Playgroud)

我需要 a 中的那些排序文件,join它目前抱怨文件之一未排序。

在我的环境中LC_COLLATELC_ALL没有设置,LANG设置为en_US.UTF-8

随着LC_ALL=C sort -k1,1输出为:

排序 11:

A
B
a
b
Run Code Online (Sandbox Code Playgroud)

排序22:

A 0
B 1
a 1
b 0
Run Code Online (Sandbox Code Playgroud)

我不需要特定的排序,我只希望它能够加入结果。这种方式join有效。为了安全起见,我也可以在前面join加上LC_ALL=C.

我的问题

为什么sorted1 a之前 Asorted2 a A?无论排序规则是什么,它都适用于两个sort命令,我根据两个输入文件中相同的第 1 列进行排序。

添加了输出 ltrace -e strcoll

文件 1

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) +++
Run Code Online (Sandbox Code Playgroud)

文件 2

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) +++
Run Code Online (Sandbox Code Playgroud)

小智 1

您的默认排序规则(en_US.UTF-8)导致了这一点。您应该设置LC_COLLATE值以按指示对文本进行排序。

 LC_COLLATE='C' sort -k1 file1
Run Code Online (Sandbox Code Playgroud)