를 사용하여 일부 데이터를 정렬하려고 합니다 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