Comment puis-je trier des nombres comme ceux-ci à l'aide d'une commande de tri.
10
11
12
1
13
14
15
16
17
18
19
20
21
2
22
3
4
5
6
7
8
9
X
Y
Comme @terdon l'a remarqué, l'inclusion de X
et Y
et le fait que les nombres vont de 1 à 22 l'identifient comme une liste possible de chromosomes humains (c'est pourquoi il dit que le chromosome M
(mitochondrial) peut être manquant).
Pour trier une liste de nombres, on utilise généralement sort -n
:
$ sort -n -o list.sorted list
où list
est la liste non triée et list.sorted
sera la liste triée résultante.
Avec -n
, sort
effectuera un tri numérique sur son entrée. Cependant, étant donné qu'une partie de l'entrée n'est pas numérique, le résultat n'est probablement pas celui voulu; X
et Y
apparaîtront en premier dans la liste triée, pas en dernier (les chromosomes sexuels sont généralement listés après le chromosome 22).
Cependant, si vous utilisez sort -V
(pour le "tri des versions"), vous obtiendrez en fait ce que vous voulez:
$ 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
Cela ne fonctionnera probablement toujours pas si vous ajoutez M
car cela serait trié avant X
et non à la fin (ce qui, je crois, est la façon dont il est généralement présenté).
vous pouvez utiliser
cat number.txt|sort -n
Si vous voulez dire qu'ils doivent trier dans l'ordre 1..22, X, Y, M, alors vous pouvez traduire ces X, Y, M en nombres avant le tri et revenir après le tri:
sed 's/X/23/;s/Y/24/;s/M/25/' < file | sort -n | sed 's/23/X/;s/24/Y/;s/25/M/'
Si ces nombres sont dans un tableau zsh
, vous pouvez appliquer un ordre de tri arbitraire en utilisant ce hack:
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]}'))