排序命令不一致的行为

排序命令不一致的行为

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

文件1:

a
b
B
A

文件2:

a 1
b 0
B 1
A 0

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

排序1:

a
A
b
B

排序2:

A 0
a 1
b 0
B 1

我需要 a 中的那些已排序的文件,join并且它当前抱怨其中一个文件未排序。

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

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

排序11:

A
B
a
b

排序22:

A 0
B 1
a 1
b 0

我不需要特定的顺序,我只希望它能够合并结果。这种方法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) +++

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

答案1

正如斯特凡·查泽拉斯 (Stéphane Chazelas) 在评论,这是 CentOS/Red Hat 的具体实现中的一个错误coreutils,更具体地说,是他们在 GNU 之上编写和应用的coreutils-8.22-11.el7有缺陷的国际化补丁 ( ) 。coreutils-i18n.patchcoreutils-8.22

我举报了这里CentOS 以及这里到红帽。已经是已知的在 Red Hat 并在coreutils-8.22-13.el7.

该产品尚不可用中央操作系统此时(2015-08-20)。

为了完整起见,请注意该错误也存在(错误的是该错误不存在)上游报道(在 GNU's)您可以找到更多关于它的信息。

答案2

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

 LC_COLLATE='C' sort -k1 file1

相关内容