为什么默认排序会在相同的行开头产生不同的结果?

为什么默认排序会在相同的行开头产生不同的结果?

我在 bash 中使用sort,但两个文件的顺序不同,即使第一组字符相同。

文件1:

  "(0, -11)": "(-1.24636393592-0.992799153308j)", 
  "(0, 1)": "(149.807097864-5.44350795193j)", 
  "(0, 0)": "(17.1604053672+3.88079235934j)", 
  "(0, 11)": "(-1.59903812426-0.923768768117j)", 
  "(0, -1)": "(47.1824114723-21.6682255934j)", 
  "(0, 10)": "(-7.9306816865-1.40521728962j)", 
  "(0, 12)": "(-1.01650580426-1.04187674309j)", 
  "(0, -10)": "(-0.901802059305-0.821904477534j)", 

文件2:

  "(0, 0)": "(0.581223595766+0.883221459338j)", 
  "(0, -1)": "(0.0296256019162+0.632637319226j)", 
  "(0, -10)": "(0.792520325166+0.141433946136j)", 
  "(0, 10)": "(-1.20153329399-0.805695804956j)", 
  "(0, 1)": "(0.285821897179-0.508323457505j)", 
  "(0, 11)": "(0.0402120404586-1.57660120897j)", 
  "(0, -11)": "(0.476001913928+0.127280670816j)", 
  "(0, 12)": "(-0.257439911355-1.2545061217j)",

sort file1给出:

  "(0, 0)": "(17.1604053672+3.88079235934j)", 
  "(0, -10)": "(-0.901802059305-0.821904477534j)", 
  "(0, 10)": "(-7.9306816865-1.40521728962j)", 
  "(0, -11)": "(-1.24636393592-0.992799153308j)", 
  "(0, 11)": "(-1.59903812426-0.923768768117j)", 
  "(0, 1)": "(149.807097864-5.44350795193j)", 
  "(0, 12)": "(-1.01650580426-1.04187674309j)", 
  "(0, -1)": "(47.1824114723-21.6682255934j)", 

sort file2给出:

  "(0, 0)": "(0.581223595766+0.883221459338j)", 
  "(0, -1)": "(0.0296256019162+0.632637319226j)", 
  "(0, -10)": "(0.792520325166+0.141433946136j)", 
  "(0, 10)": "(-1.20153329399-0.805695804956j)", 
  "(0, 1)": "(0.285821897179-0.508323457505j)", 
  "(0, 11)": "(0.0402120404586-1.57660120897j)", 
  "(0, -11)": "(0.476001913928+0.127280670816j)", 
  "(0, 12)": "(-0.257439911355-1.2545061217j)", 

类似地,sort file1 file2给出了一个似乎没有按字母顺序、数字或其他方式排序的列表。

我希望默认情况下会按字母顺序排序 - 一次比较一个字符。这些列表应该是完全可排序的,而不会达到它们开始不同的第 10 个左右的字符,那么为什么在对它们进行排序时会得到不同的顺序呢?

编辑1 使用数字标志-g-n仍然给出不一致的结果。

按第一个字段排序按预期工作,例如sort <(cat file1 file2 | cut -f1 -d':')

编辑2 有关我的问题的答案,请参阅已接受的答案。

我的问题的解决方案(受到下面答案的启发)似乎是:

LC_ALL=C sort file1
LC_ALL=C sort file2

这会进行按字节排序。我不关心排序顺序,只要两个具有相同内容的文件最终以相同的顺序即可,我认为这可以实现这一点。

编辑3

这不是其他问题的重复。我没有询问有关排序 << 括号的问题。是的,答案确实适用。重复问题和可以应用相同广泛答案的单独问题之间存在差异。这里的关键是,我(以及可能有我的问题的其他人)在寻找我遇到的问题时不会找到其他问题。

太长了;它们不是重复的问题 - 只是相关的问题和相关的答案。它们应该是“联系在一起”的。未标记重复。

答案1

排序遵循排序规则,这些规则由 LC_COLLATE 语言环境设置选择(或 LC_ALL 如果已设置,则在两者均未设置时回退到 LANG)。这背后的理由很明显——不同的语言有不同的字母顺序规则。

显然,您选择的语言的排序规则会跳过“-”。

$ LC_COLLATE=en_DK sort file2
"(0, 0)": "(0.581223595766+0.883221459338j)", 
"(0, -1)": "(0.0296256019162+0.632637319226j)", 
"(0, -10)": "(0.792520325166+0.141433946136j)", 
"(0, 10)": "(-1.20153329399-0.805695804956j)", 
"(0, 1)": "(0.285821897179-0.508323457505j)", 
"(0, 11)": "(0.0402120404586-1.57660120897j)", 
"(0, -11)": "(0.476001913928+0.127280670816j)", 
"(0, 12)": "(-0.257439911355-1.2545061217j)", 

$ LC_COLLATE=C sort file2
"(0, -1)": "(0.0296256019162+0.632637319226j)", 
"(0, -10)": "(0.792520325166+0.141433946136j)", 
"(0, -11)": "(0.476001913928+0.127280670816j)", 
"(0, 0)": "(0.581223595766+0.883221459338j)", 
"(0, 1)": "(0.285821897179-0.508323457505j)", 
"(0, 10)": "(-1.20153329399-0.805695804956j)", 
"(0, 11)": "(0.0402120404586-1.57660120897j)", 
"(0, 12)": "(-0.257439911355-1.2545061217j)", 

相关内容