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_COLLATE
并LC_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
是之前 A
在sorted2
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)
归档时间: |
|
查看次数: |
1725 次 |
最近记录: |