Como posso classificar números em um shell unix?

0

Como posso classificar números como esses usando um comando 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
    
por user1703276 01.04.2017 / 15:52

3 respostas

5

Como @terdon notou, a inclusão de X e Y e o fato de que os números vão de 1 a 22 identifica isso como uma possível lista de cromossomos humanos (é por isso que ele diz que cromossomo M ( mitocondrial) pode estar faltando).

Para classificar uma lista de números, normalmente usaria sort -n :

$ sort -n -o list.sorted list

em que list é a lista não classificada e list.sorted será a lista classificada resultante.

Com -n , sort executará uma classificação numérica em sua entrada. No entanto, como algumas das entradas não são numéricas, o resultado provavelmente não é o pretendido; X e Y aparecerão primeiro na lista ordenada, não na última (os cromossomos sexuais são geralmente listados após o cromossomo 22).

No entanto, se você usar sort -V (para "classificação de versão"), você realmente obterá o que deseja:

$ 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

Isso provavelmente ainda não funcionará se você adicionar M , pois isso seria classificado antes de X e não no final (que, acredito, é como é apresentado normalmente).

    
por 01.04.2017 / 16:44
1

Se você quer dizer que eles devem ordenar na ordem 1..22, X, Y, M, então você pode traduzir esses X, Y, M para números antes de ordenar e voltar após a ordenação:

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

Se esses números estiverem em uma matriz zsh , você poderá aplicar uma ordem de classificação arbitrária usando este 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]}'))
    
por 17.09.2018 / 12:31
0

você pode usar

cat number.txt|sort -n
    
por 17.09.2018 / 12:03

Tags