각 필드를 숫자로 정렬하고 필드 개수를 구분합니다.

각 필드를 숫자로 정렬하고 필드 개수를 구분합니다.

를 사용하여 일부 데이터를 정렬하려고 합니다 sort. 숫자가 아닌 숫자로 정렬되는 것을 확인하여 플래그를 추가했습니다 -n. 그러나 첫 번째 필드만 숫자로만 정렬하는 것 같습니다. 행의 필드 수가 다르기 때문에 필드별로 분류하는 것은 문제가 됩니다(솔직히 어떻게 작동하는지 이해할 수 없습니다). 제가 사용하고 있는 샘플 데이터는 다음과 같습니다.

echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n18 2\nb 10\n18 15\nb a 2\n23 9\nb 2" | sort -n

Input     Want      Expect?   sort      -n        -n -k1,1 -k2,2 -k3,3 -k4,4…

b b 1     8 2       a 1       23 44     a 1       b a 1
23 44     8 15      a 7       23 9      a 7       b a 10
b 3       23 9      b a 1     8 15      b 1       b a 2
a 7       23 44     b a 2     8 2       b 10      b b 1
b b 2     a 1       b a 10    a 1       b 2       b b 10
a 1       a 7       b b 1     a 7       b 3       b b 2
b a 10    b 1       b b 2     b 1       b a 1     a 1
b b 10    b 2       b b 10    b 10      b a 10    b 1
b 1       b 3       b 1       b 2       b a 2     b 2
b a 1     b 10      b 2       b 3       b b 1     b 3
8 2       b a 1     b 3       b a 1     b b 10    a 7
b 10      b a 2     b 10      b a 10    b b 2     b 10
8 15      b a 10    8 2       b a 2     8 15      8 2
b a 2     b b 1     8 15      b b 1     8 2       8 15
23 9      b b 2     23 9      b b 10    23 44     23 9
b 2       b b 10    23 44     b b 2     23 9      23 44

이상적으로는 GNU coreutils 정렬 5.93을 사용하는 시스템에서 실행하고 싶습니다. 나는 간단한 유닉스 도구로 그것을 처리하고 싶다; 나는 문제를 Perl 등에 맡기고 싶지 않다. 동등한 것이 있었으면 좋겠다 [상상해]sort --numeric-sort --all-fields --actually-work

답변1

내 생각에 당신의 문제는 당신이 하고 있는 일을 이해하지 못한다는 것입니다 sort. 기본 정렬은 ASCII 문자 값을 기반으로 하며 숫자는 대문자 앞에, 숫자는 소문자 앞에 옵니다('1' == 49, 'A' == 65, 'a' = 97). 이는 sort'23'과 같은 숫자가 '8' 이전, 'b b' 이전에 정렬되는 열에 대해 설명합니다. '2'의 ASCII 값은 50이고 '8'의 ASCII 값은 56이며 'b'의 ASCII 값은 98입니다.

숫자로 정렬하는 경우( sort -n) 숫자가 아닌 항목은 정상적으로 정렬되지만 23 또는 8과 같은 숫자와 비교하면 0으로 해석되지만 값은 문자 값이 아닌 숫자로 처리되므로 "8" 이전에는 " 23"에 있습니다. 따라서 알파벳 항목은 숫자 항목보다 먼저 정렬됩니다.

가장 좋은 방법은 각 열이 동일한 유형의 값(모두 숫자 또는 모두 영숫자, 적절하게 정렬)을 갖도록 데이터를 정규화하는 것입니다.

마지막 열(필드 기준 정렬)에서는 명시적으로 4개(또는 그 이상) 필드를 지정했으므로 더 많은 필드가 있는 항목을 먼저 정렬합니다. 따라서 (1,2,3)이 (1,2) 앞에 옵니다. 이 -k옵션이 없으면 정렬 시 행 전체가 고려됩니다.

다음에 대해 더 자세히 읽을 수 있습니다.정보 핵심 유틸리티 정렬페이지.

답변2

echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n18 2\nb 10\n18 15\nb a 2\n23 9\nb 2" \
| sed -r 's/[a-z]/9999&/g' | sort -n -k1 -k2 -k3 | sed 's/9999//g' 
18 2
18 15
23 9
23 44
a 1
b 1
b 2
b 3
a 7
b 10
b a 1
b b 1
b a 2
b b 2
b a 10
b b 10

이것이 당신이 원하는 것입니까? 숫자인 경우 숫자별로 정렬하고 다른 문자 앞에 숫자를 넣으시겠습니까?

각 문자열 앞에 큰 숫자를 붙여서 문자열을 정렬하고 끝에 있는 큰 숫자(9999)를 제거합니다.

답변3

수년간의 개발 끝에 sort -V원하는 sort 8.26결과가 나왔습니다.

$ echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n8 2\nb 10\n8 15\nb a 2\n23 9\nb 2" \
   | sort -V
8 2
8 15
23 9
23 44
a 1
a 7
b 1
b 2
b 3
b 10
b a 1
b a 2
b a 10
b b 1
b b 2
b b 10

관련 정보