web-dev-qa-db-fra.com

Comment trier les nombres dans un shell Unix?

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
18
user1703276

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

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é).

34
Kusalananda

vous pouvez utiliser

cat number.txt|sort -n
1
RAJ METRE

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]}'))
1
Stéphane Chazelas