Sort

為什麼預設排序會產生具有相同行開頭的不同結果?

  • May 21, 2018

sort在 bash 中使用,但是即使第一組字元相同,兩個文件的順序也不同。

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

**這不是另一個問題的重複。**我沒有要求對 << 括號進行排序。是的,答案確實適用。重複的問題和可以應用相同廣泛答案的單獨問題之間存在差異。這裡的關鍵是我(可能還有其他有我的問題的人)在尋找我遇到的問題時不會找到另一個問題。

**TLDR;**它們不是重複的問題——只是相關的問題和相關的答案。它們應該是“連結的”。未標記為重複。

排序遵循排序規則,由 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)", 

引用自:https://unix.stackexchange.com/questions/444656