Wie sortiere ich UNIX nach nur einer Spalte?


47

Ich weiß, dass die Option -k für die Unix- Sortierung es uns ermöglicht, nach einer bestimmten Spalte und allen folgenden zu sortieren . Beispiel für die Eingabedatei:

2 3
2 2
1 2
2 1
1 1

Mit sort -n -k 1bekomme ich eine Ausgabe sortiert nach der 1. Spalte und dann nach der 2.:

1 1
1 2
2 1
2 2
2 3

Ich möchte jedoch die Reihenfolge der zweiten Spalte beibehalten:

1 2
1 1
2 3
2 2
2 1

Ist das mit dem sortBefehl möglich?

Antworten:


64

Probieren Sie es aus:

sort -s -n -k 1,1

Mit dieser -sOption wird die Sortierung auf "letzte Instanz" deaktiviert, bei der alle Elemente sortiert werden, die nicht Teil eines angegebenen Schlüssels sind.

Das -k 1bedeutet im Kontext der numerischen Sortierung nicht "dieses Feld und alle folgenden", da Sie sehen können, ob Sie versuchen, in der zweiten Spalte zu sortieren. Sie sehen lediglich, wie Verbindungen unterbrochen werden, wenn Sie zum Rest der Leitung gehen. Im Allgemeinen müssen Sie jedoch angeben -k 1,1, dass nur nach Feld 1 sortiert werden soll .


Du hast recht. Genau das habe ich gebraucht. Vielen Dank!

Ist es möglich, Join für die Ausgabe dieser Art zu verwenden?
MiNdFrEaK

@MiNdFrEaK: Die Anforderung von joinist, dass die Eingabe nach den Feldern sortiert wird, an denen Sie teilnehmen. Diese Ausgabe ist also nach dem ersten Feld sortiert, und Sie können daran teilnehmen.
Cascabel

Ich habe 2 Dateien, eine mit 2 Spalten, eine andere mit 1 Spalte. Die zweite Datei wird mit sort -u sortiert. Jetzt muss ich diese Spalte mit der ersten Spalte der ersten Datei verbinden, die nicht sortiert ist. Wie lautet also die Syntax? Ob das funktioniert? Join -j 1 Datei2.txt Sortieren -s -n -k 1 Datei1.txt?
MiNdFrEaK

1
Das -k 1,1(die „ 1 “ -Teil) funktioniert nicht besser für mich. Was funktioniert ist -s -k 1, -nwenn Sie es brauchen.
Totor

10

Um nur nach der ersten Spalte zu sortieren, sollten Sie Folgendes tun:

sort -n -s -k1,1

Aus dem Unix- und Linux-Systemverwaltungshandbuch

sort akzeptiert die Schlüsselspezifikation -k3 (anstatt -k3,3), aber es tut wahrscheinlich nicht das, was Sie erwarten. Ohne die abschließende Feldnummer fährt der Sortierschlüssel bis zum Ende der Zeile fort


Ich arbeite nicht für mich, sondern muss die -sOption hinzufügen, wie Cascabel betont hat.
Jean Paul

@JeanPaul Sie haben Recht, die Dokumentation für -ssagt "Diese Option behält die ursprüngliche Datensatzreihenfolge von Datensätzen bei, die einen gleichen Schlüssel haben."
Tidbeck

2

Keine der angegebenen Antworten funktioniert generell für mich.

Beides sort -s -k 2 file1und sort -n -k1,1zusätzliche Sortierung mit dieser Datei:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Ich musste genau das tun und endete mit einer Shell-Schleife. Diese Lösung eignet sich möglicherweise nicht für sehr große Dateien, da für jeden eindeutigen Wert in der sortierten Spalte die gesamte Datei gelesen werden muss.

Hier ist die Datei nur nach Spalte 2 sortiert.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
Plhn

Die von Cascabel vorgeschlagene Antwort funktioniert, aber ich glaube, Sie haben sie falsch gelesen.
Jean Paul
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.