Wie kann ich Zahlen in einer Unix-Shell sortieren?


18

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

4
Wie genau sortieren? Das scheint eine völlig willkürliche Sortierreihenfolge zu sein. Und das sind keine Zahlen. Außerdem hast du chrM vergessen. Bitte bearbeiten Sie Ihre Frage und klären Sie. Was genau versuchst du zu tun?
Terdon

Kein Versuch und unklar, was Sie fragen . Bitte fügen Sie Ihre gewünschte Ausgabe hinzu und was Sie versucht haben, um sie zu erhalten.
Simlev

Antworten:


35

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


Oh, also ist die Liste der in der Frage dargestellten Werte eher die zu sortierende Menge als das beabsichtigte Ergebnis einer (scheinbar willkürlichen) Sortierung?
Roaima

@roaima So interpretiere ich es. Und wenn es sich um Chromosomen handelt, werden sie höchstwahrscheinlich numerisch sortiert und anschließend Xgefolgt Y.
Kusalananda

Vielen Dank. Es warf mich völlig; Ich habe nicht erwartet, dass die Liste die Rohmenge ist, sondern die sortierte Menge. Ich habe die Sprache in der Frage ein wenig angepasst, um dies zu klären.
Roaima

1

Sie können verwenden

cat number.txt|sort -n

3
Siehe meine Antwort, warum dies wahrscheinlich nicht das richtige Ergebnis liefert. Auch catist hier völlig unnötig.
Kusalananda

1

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]}'))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.