숫자와 알파벳 문자를 혼합하여 정렬하는 방법은 무엇입니까?

숫자와 알파벳 문자를 혼합하여 정렬하는 방법은 무엇입니까?

명령을 사용하여 sort이러한 입력을 어떻게 정렬 할 수 있나요? 숫자를 문자보다 먼저 숫자순으로 정렬하고 싶습니다.

10
11
12
1
13
14
15
16
17
18
19
20
21
2
22
3
4
5
6
7
8
9
X
Y

답변1

X@terdon이 알아차렸듯이, 1부터 22까지의 및 및 숫자가 포함되어 있다는 사실은 Y이것이 인간 염색체의 가능한 목록임을 암시합니다(이것이 그가 염색체 M(미토콘드리아)가 누락되었을 수 있다고 말한 이유입니다).

숫자 목록을 정렬하려면 일반적으로 다음을 사용합니다 sort -n.

$ sort -n -o list.sorted list

list정렬되지 않은 목록은 어디에 있고 list.sorted결과로 정렬된 목록이 됩니다.

를 사용하면 -n입력 sort에 대해 숫자 정렬이 수행됩니다. 그러나 일부 입력은 숫자가 아니기 때문에 결과가 정렬된 목록에서 마지막이 아닌 첫 번째로 나타날 X것으로 예상되지 않을 수 있습니다(성염색체는 일반적으로 염색체 22번 뒤에 나열됩니다).Y

그러나 "버전 정렬"을 위해 사용하면 sort -V실제로 원하는 것을 얻을 수 있습니다.

$ sort -V -o list.sorted list
$ cat list.sorted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
X
Y

이것을 추가하더라도 마지막이 아닌 M이전에 정렬되므로 여전히 작동하지 않을 수 있습니다 X(보통 그렇게 표시되는 방식이라고 생각합니다).

답변2

1..22,X,Y,M 순서로 정렬해야 한다는 의미라면 정렬하기 전에 X,Y,M을 숫자로 변환하고 정렬한 후에 다시 되돌릴 수 있습니다.

sed 's/X/23/;s/Y/24/;s/M/25/' < file | sort -n | sed 's/23/X/;s/24/Y/;s/25/M/'

숫자가 배열에 있는 경우 zsh다음 트릭을 사용하여 임의의 정렬 순서를 적용할 수 있습니다.

k=({1..22} X Y M) v=({01..25})
typeset -A rank=(${k:^v})

unsorted=(22 Y 5 X M 13)
sorted=(/(e'{reply=($unsorted)}'oe'{REPLY=$rank[$REPLY]}'))

또는 멤버가 $unsorted고유한 경우 배열 교차를 사용합니다.

all=({1..22} X Y M)
unsorted=(22 Y 5 X M 13)
sorted=(${all:*unsorted})

답변3

당신은 그것을 사용할 수 있습니다

cat number.txt|sort -n

관련 정보