Wie kann man UNIX nur nach einer Spalte sortieren?

116348
ssn

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

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. Spalte:

1 1 1 2 2 1 2 2 2 3 

Ich möchte jedoch die zweite Spalte wie folgt beibehalten:

1 2 1 1 2 3 2 2 2 1 

Ist das mit dem sortBefehl möglich?

43

3 Antworten auf die Frage

59
Cascabel

Probieren Sie es aus:

sort -s -n -k 1,1 

Die -sSortierung nach dem letzten Ausweg ist deaktiviert, wodurch nach allem sortiert wird, was nicht Teil eines angegebenen Schlüssels ist.

Das -k 1bedeutet eigentlich nicht "dieses Feld und alle folgenden" im Kontext der numerischen Sortierung, wie Sie sehen können, wenn Sie versuchen, die zweite Spalte zu sortieren. Sie sehen nur, dass die Bande gebrochen sind, wenn Sie zum Rest der Linie gehen. Im Allgemeinen müssen Sie jedoch angeben -k 1,1, dass nur Feld 1 sortiert werden soll .

Du hast recht. Genau das brauchte ich. Vielen Dank! vor 14 Jahren 0
ist es möglich, join für die Ausgabe dieser Art zu verwenden? MiNdFrEaK vor 11 Jahren 0
@MiNdFrEaK: Die Voraussetzung für "join" ist, dass die Eingabe nach den Feldern sortiert wird, in denen Sie beitreten. Diese Ausgabe wird also im ersten Feld sortiert und Sie können daran teilnehmen. Cascabel vor 11 Jahren 0
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 verknüpfen, die nicht sortiert ist. Was wird also die Syntax sein? Ob das funktioniert? join -j 1 file2.txt sortiere -s -n -k 1 file1.txt? MiNdFrEaK vor 11 Jahren 0
@MiNdFrEaK: Wenn Sie eine völlig andere Frage haben, stellen Sie diese separat. Bei dieser Frage geht es darum, eine Datei auf eine bestimmte Art und Weise zu sortieren, und nicht, wie Join funktioniert. Cascabel vor 11 Jahren 0
Ihre Antwort ist korrekt, wenn die numerische Sortierung verwendet wird. Aber sonst ist es irreführend. Bitte aktualisieren Sie es wie folgt, damit niemand in Schwierigkeiten gerät `-s -n -k 1,1`. palindrom vor 10 Jahren 0
Der `-k 1,1` (der Teil" **, 1 ** ") funktioniert für mich nicht besser. Was funktioniert, ist "-s -k 1", mit "-n", wenn Sie es brauchen. Totor vor 10 Jahren 1
10
tidbeck

To only sort on the first column you should do:

sort -n -k1,1 

From Unix and Linux System Administration Handbook

sort accepts the key specification -k3 (rather than -k3,3), but it probably doesn’t do what you expect. Without the terminating field number, the sort key continues to the end of the line

2
user680341

Keine der 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 funktioniert möglicherweise nicht gut für sehr große Dateien, da die gesamte Datei für jeden eindeutigen Wert in der sortierten Spalte gelesen werden muss.

Hier ist die Datei nur in Spalte 2 sortiert.

# awk '' 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 vor 7 Jahren 0