Sort
為什麼預設排序會產生具有相同行開頭的不同結果?
我
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)",