如何对数字和字母字符的混合进行排序?

如何对数字和字母字符的混合进行排序?

如何使用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

正如 @terdon 所注意到的,包含XY以及数字从 1 到 22 的事实表明这是一个可能的人类染色体列表(这就是为什么他说染色体M(线粒体)可能缺失)。

要对数字列表进行排序,通常会使用sort -n

$ sort -n -o list.sorted list

其中list是未排序的列表,并且list.sorted将是生成的排序列表。

使用-n,sort将对其输入执行数字排序。然而,由于某些输入不是数字,因此结果可能不是预期的;X并将Y出现在排序列表中的第一个,而不是最后一个(性染色体通常列在 22 号染色体之后)。

但是,如果您使用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

相关内容