gnu sort在MacOS Linux上产生不同的结果

时间:2014-03-05 12:49:33

标签: linux macos sorting homebrew

我试图在MacOS Mavericks和Linux Centos 6.5上获得相同的GNU排序输出。我在MacOS上安装了最新的'brew'gsort。在对完全相同的文件进行排序时,我会从两个平台上的排序中获得不同的输出结果:具体来说,“#”字符的处理方式。以下是排序文件的第一行,您可以非常清楚地看到差异:

MacOS brew gsort:

SENT_ID1###de peu ||| and gustav stresemann ||| 1.0<br/>
SENT_ID1###en compagnie d' aristide briand ||| only just missed achieving ||| 1.0<br/>
SENT_ID1###et de gustav stresemann ||| their aim ||| 1.0<br/>
SENT_ID1###il a manqué cet objectif ||| he and aristide briand ||| 1.0<br/>
SENT_ID10###dans le même esprit ||| still ||| 1.0<br/>
SENT_ID10###de comblement ||| with the same aim of making good ||| 1.0<br/>
SENT_ID10###de nos institutions européennes ||| of institutional democracy ||| 1.0<br/>

CentOS上带有'sort'的相同文件:

SENT_ID10000###car il constitue l' ||| as it constitutes ||| 1.0<br/>
SENT_ID10000###de ce débat ||| of this debate ||| 1.0<br/>
SENT_ID10000###nous pensons ||| we think ||| 1.0<br/>
SENT_ID10000###que ce paragraphe aurait mérité ||| that this section would have merited ||| 1.0<br/>
SENT_ID10000###un des défis majeurs ||| one of the major challenges ||| 1.0<br/>

SENT_ID10000###un plus ample développement ||| further development ||| 1.0<br/>
SENT_ID10001###à aucune règle si ce n' est celle du marché ||| only to market rules ||| 1.0<br/>
SENT_ID10001###ces systèmes complémentaires ||| these supplementary systems ||| 1.0<br/>
SENT_ID10001###en augmentation ||| which are increasing ||| 1.0<br/>
SENT_ID10001###ne sont soumis ||| are subject ||| 1.0<br/>

在CentOS下的零字符中,零字符优先于'hash'字符,您可以看到排序顺序完全不同。 gsort MacOS排序顺序是我期望的。任何人都可以告诉我为什么CentOS排序顺序错误以及如何纠正这个问题?

1 个答案:

答案 0 :(得分:1)

即使两个系统上的LC_COLLATE=C显然相同,我在macOS和Linux上也看到了不同的行为。

如果使用LC_COLLATE=POSIXfr_FR.UTF-8,则在两个操作系统之间至少应该保持一致。

macOS,$ (export LC_COLLATE=fr_FR.UTF-8; echo -e 'a\nA\na.1\nA.1\na1\nA1\na#1\nA#1' | gsort) A A#1 A.1 A1 a a#1 a.1 a1

#

注意大写字母在小写字母之前排序,..之前排序,而1fr_FR.utf8之前排序。

Linux(RH6),$ (export LC_COLLATE=fr_FR.utf8; echo -e 'a\nA\na.1\nA.1\na1\nA1\na#1\nA#1' | sort) a A a1 a.1 a#1 A1 A.1 A#1

1

注意大写字母在小写字母后面排序,..之前排序,#POSIX之前

现在有$ (export LC_COLLATE=POSIX; echo -e 'a\nA\na.1\nA.1\na1\nA1\na#1\nA#1' | gsort) A A#1 A.1 A1 a a#1 a.1 a1

macOS:

$ (export LC_COLLATE=POSIX; echo -e 'a\nA\na.1\nA.1\na1\nA1\na#1\nA#1' | sort)
A
A#1
A.1
A1
a
a#1
a.1
a1

Linux:

e.set_n(3);
d.set_c('b');
std::cout << c.get_c() << d.get_n() << std::endl;

有趣的是,macOS默认排序规则似乎更接近POSIX标准。我想知道其背后的历史。