如何使用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 所注意到的,包含X
和Y
以及数字从 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