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 Xund Yund 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 listist die unsortierte Liste und list.sortedwird die resultierende sortierte Liste sein.
Mit -n, sortwird eine numerische Art an seinem Eingang durchzuführen. Da jedoch ein Teil der Eingabe nicht numerisch ist, ist das Ergebnis wahrscheinlich nicht beabsichtigt. Xund Yerscheint 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, Mda dies vorher Xund nicht am Ende sortiert wird (was meiner Meinung nach normalerweise so dargestellt wird).
Xgefolgt Y.
Sie können verwenden
cat number.txt|sort -n
catist 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 zshArray 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]}'))