Unix alphabetisch und dann numerisch sortieren, funktioniert nicht wie beabsichtigt

Unix alphabetisch und dann numerisch sortieren, funktioniert nicht wie beabsichtigt

Entschuldigen Sie, wenn dies eine doppelte Frage ist, aber ich konnte die gesuchte Antwort hier oder in der Dokumentation nicht finden.

Ich habe eine Datei, die wie folgt aussieht:

chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr4_oligo95    50  100
chr5_oligo1 50  100
chr4_oligo4 150 200

Die gewünschte Ausgabe sieht wie folgt aus:

chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo95    50  100
chr4_oligo4 150 200
chr5_oligo1 50  100

Das Muster am Anfang (z. B. chr#_oligo#) ist nur in Bezug auf die chr# von Bedeutung, d. h. alle chr1 sollten zuerst kommen, dann chr2, dann chr3 usw., aber ich möchte diese Teilzeichenfolgen numerisch in Gruppen sortieren, wie in der gewünschten Ausgabe oben gezeigt. Ich möchte also wissen, wie man im Fall der ersten Spalte alphabetisch sortiert und dann unter Beibehaltung dieser Reihenfolge (chr1->chrN) jeden Datenblock numerisch sortiert.

Ich entschuldige mich, wenn meine Formulierung für dieses Problem nicht die beste ist oder wenn es sich um ein Duplikat handelt. Ich versuche

sort -k1,1 -nk2

sortiert numerisch richtig, behält aber die erste Sortierung nicht bei (bringt die erste Spalte durcheinander und fügt alle Zeilen mit den Spalten 2 und 3 so zusammen:

50   100

Ich verwende Mac OS X.

BEARBEITEN: Ich möchte einige der Beispiele in der ersten Spalte ändern, um mehr von dem anzuzeigen, wonach ich suche. gsort -V hat gut funktioniert, wenn der Name in der ersten Spalte in numerischer Reihenfolge ist, aber in meinem Datensatz ist das nicht immer der Fall.

Ich möchte grundsätzlich jede Untergruppe (in diesem Fall chr1, chr2 usw.) iterativ nach Spalte 2 sortieren. Mir ist klar, dass dies leicht möglich ist, indem man für jede ein grep ausführt und dann nach Spalte 2 sortiert, aber ich würde gerne wissen, ob sort oder ein anderer Unix-Befehl dies allein bewerkstelligen kann.

Antwort1

sort -k1,1 -nk2ist das gleiche wie sort -k1,1 -n -k2, dasselbe wie sort -n -k1,1 -k2, wie in derNumerischDie Sortierung ist global für alle Schlüssel aktiviert.

Um den 2. Schlüssel nur numerisch zu sortieren , müssen Sie ndiesem Sortierschlüssel die folgende Beschreibung hinzufügen:

sort -k1,1 -k2n

Oder:

sort -k1,1 -k2,2n

Mit nund mit ist der Standard-Feldtrenner 2dasselbe, als 2,2ob. 2wäre der Teil der Zeile, der beim zweiten Feld beginnt, aber wenn es als Zahl interpretiert wird, ist das dasselbe wie das zweite Feld allein ( 2,2).

Hier könnte man auch numerisch nach der darauffolgenden Zahl sortieren chrund dann alphabetisch nach dem Rest des ersten Feldes und anschließend numerisch nach dem zweiten Feld mit:

sort -k1.4n -k1,1 -k2n

Antwort2

alphabetisches Sortieren im 1. Feld und numerisches Sortieren im 2. ergibt (in Ihrer Ausgabe steht -- chr4_oligo95 vor ch4_oligo4)

sort -k1,1 -k2n,2n file 
chr1_oligo1 50  100
chr1_oligo256   150 200
chr1_oligo6 3500    3550
chr2_oligo1234  700 750
chr2_oligo1236  750 800
chr4_oligo4 150 200
chr4_oligo95    50  100
chr5_oligo1 50  100

verwandte Informationen