Wie kann ich solche Zahlen mit einem Sortierbefehl sortieren?
10
11
12
1
13
14
15
16
17
18
19
20
21
2
22
3
4
5
6
7
8
9
X
Y
Wie kann ich solche Zahlen mit einem Sortierbefehl sortieren?
10
11
12
1
13
14
15
16
17
18
19
20
21
2
22
3
4
5
6
7
8
9
X
Y
Antworten:
Wie @terdon bemerkte, wird dies durch die Einbeziehung von X
und Y
und die Tatsache, dass die Zahlen zwischen 1 und 22 liegen, als mögliche Liste menschlicher Chromosomen identifiziert (weshalb er sagt, dass Chromosomen M
(Mitochondrien) möglicherweise fehlen).
Um eine Liste von Zahlen zu sortieren, würde man normalerweise verwenden sort -n
:
$ sort -n -o list.sorted list
Wo list
ist die unsortierte Liste und list.sorted
wird die resultierende sortierte Liste sein.
Mit -n
, sort
wird eine numerische Art an seinem Eingang durchzuführen. Da jedoch ein Teil der Eingabe nicht numerisch ist, ist das Ergebnis wahrscheinlich nicht beabsichtigt. X
und Y
erscheint zuerst in der sortierten Liste, nicht zuletzt (die Geschlechtschromosomen werden normalerweise nach Chromosom 22 aufgelistet).
Wenn Sie jedoch sort -V
(für "Versionssortierung") verwenden, erhalten Sie tatsächlich das, was Sie wollen:
$ 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
Dies wird wahrscheinlich immer noch nicht funktionieren, wenn Sie hinzufügen, M
da dies vorher X
und nicht am Ende sortiert wird (was meiner Meinung nach normalerweise so dargestellt wird).
X
gefolgt Y
.
Sie können verwenden
cat number.txt|sort -n
cat
ist hier völlig unnötig.
Wenn Sie meinen, sie sollten in der Reihenfolge 1..22, X, Y, M sortieren, können Sie diese X, Y, M vor dem Sortieren in Zahlen und nach dem Sortieren zurück übersetzen:
sed 's/X/23/;s/Y/24/;s/M/25/' < file | sort -n | sed 's/23/X/;s/24/Y/;s/25/M/'
Wenn sich diese Zahlen in einem zsh
Array befinden, können Sie mit diesem Hack eine beliebige Sortierreihenfolge anwenden:
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]}'))