2016-04-07 12 views
0

Vielen Dank im Voraus für eine Beratung.Sortieren nach String-Schlüssel und dann nach Ganzzahl (bash)

Ich versuche, eine Datei durch Tab-getrennte Felder zu sortieren (wie unten gezeigt). Die wichtigen Felder sind die Felder 1 und 2.

ID (sortiert nach String-Werten) und dann die Startposition in einem größeren String (numerisch sortiert).

KI270036.1 5137 5523 -1 
KI270036.1 5215 5636 -1 
**KI270036.1 546  1448 -1** 
KI270036.1 6364 7425 -1 
KI270036.1 8687 9529 -1 
KI270041.1 1957 2343 1 
KI270041.1 3114 3423 1 
KI270041.1 4792 5439 1 
KI270041.1 5703 6308 1 

Dies ist ein Beispiel für die Tabelle, die ich versuche zu sortieren. Beachten Sie, dass die ersten Felder in der richtigen Reihenfolge angeordnet sind, aber das fett gedruckte Feld ist gemäß meinen Spezifikationen nicht in Ordnung.

Der Befehl, den ich eintrat, war:

sort -g -t '  ' -k 1,2 my_file.txt 

Wie kann ich ändern, dies die Datensätze nach ID gruppiert zu erreichen und dann numerisch durch das zweite Feld sortiert?

Die Ausgabe in diesem Beispiel, die ich suche ist:

**KI270036.1 546  1448 -1** 
KI270036.1 5137 5523 -1 
KI270036.1 5215 5636 -1 
KI270036.1 6364 7425 -1 
KI270036.1 8687 9529 -1 
KI270041.1 1957 2343 1 
KI270041.1 3114 3423 1 
KI270041.1 4792 5439 1 
KI270041.1 5703 6308 1 
+0

von ‚Feld 1 und Feld 2‘ erhalten würden tun, meinen Sie die Spalte mit 'KI270036.1' etc als Feld 1 und der Spalte, beginnend mit '5137' als Feld 2? – dawg

+0

ja, ich gehe mit der Konvention von 'cut' und' awk' – libby

Antwort

2

Sie können mehrere Schlüssel definieren, da das erste Feld eine feste Größe hat, kein spezielles Flag erforderlich ist (lexikalische Sortierung ist in Ordnung), für die zweite Angabe numerisch.

$ sort -k1,1 -k2n file 

nach Sternen zu entfernen, das ist, was Sie

KI270036.1 546  1448 -1 
KI270036.1 5137 5523 -1 
KI270036.1 5215 5636 -1 
KI270036.1 6364 7425 -1 
KI270036.1 8687 9529 -1 
KI270041.1 1957 2343 1 
KI270041.1 3114 3423 1 
KI270041.1 4792 5439 1 
KI270041.1 5703 6308 1 
+0

Dies half mir, aber es sollte '-k2g' statt' -k2n' sein, oder vielleicht macht es keinen Unterschied. .. Ich kann es jetzt nicht sagen. Aber es hat geholfen. Vielen Dank. – libby

+0

für ganze Zahlen 'n' ist in Ordnung. – karakfa

+0

Sie wollen '-k2,2n' annehmen, wenn Sie nicht möchten, dass die zweite Feldsortierung den Rest der Zeile berücksichtigt. (Es kommt hier nicht ins Spiel, aber wenn Sie die Zeile '546' duplizieren, aber das dritte Feld' 2448' in der ersten Kopie der Zeile machen, sehen Sie den Unterschied. –

0

mit dem zweiten eine stabile Art durch sort zwei Durchgänge durchführen:

$ sort my_file.txt | sort -g -s -k 2 
**KI270036.1 546  1448 -1** 
KI270041.1 1957 2343 1 
KI270041.1 3114 3423 1 
KI270041.1 4792 5439 1 
KI270036.1 5137 5523 -1 
KI270036.1 5215 5636 -1 
KI270041.1 5703 6308 1 
KI270036.1 6364 7425 -1 
KI270036.1 8687 9529 -1 

Oder

$ sort -g -s -k 2 my_file.txt | sort -s 
**KI270036.1 546  1448 -1** 
KI270036.1 5137 5523 -1 
KI270036.1 5215 5636 -1 
KI270036.1 6364 7425 -1 
KI270036.1 8687 9529 -1 
KI270041.1 1957 2343 1 
KI270041.1 3114 3423 1 
KI270041.1 4792 5439 1 
KI270041.1 5703 6308 1 

Abhängig vom primären Sortierschlüssel (Sie haben keine Beispielausgabe und es ist mehrdeutig ...)

Verwandte Themen