기본 정렬이 동일한 줄 시작에서 다른 결과를 생성하는 이유는 무엇입니까? [복사]

기본 정렬이 동일한 줄 시작에서 다른 결과를 생성하는 이유는 무엇입니까? [복사]

나는 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)", 

관련 정보