我想对两个文件进行排序,但无法获得一致的结果。似乎整理有问题,但我无法理解原因。在示例文件中,分隔符是一个空格:
文件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_COLLATE
并LC_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.patch
coreutils-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