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 -nk2
ist 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 n
diesem Sortierschlüssel die folgende Beschreibung hinzufügen:
sort -k1,1 -k2n
Oder:
sort -k1,1 -k2,2n
Mit n
und mit ist der Standard-Feldtrenner 2
dasselbe, als 2,2
ob. 2
wä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 chr
und 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