PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash: sort



superviser
13-04-2010, 15:28
Hallo liebe Leser,

ich möchte etwas recht simples lösen, weiß aber nicht wie.

Ein Datensatz bestehend aus einer bestimmten Anzahl Zeilen und zwei Spalten soll sortiert werden.

Allerdings, und jetzt kommts, darf dabei nur nach der ersten Spalte sortiert werden. Tauchen in der ersten Spalte doppelte Nennungen auf, müssen diese unsortiert in ihrer ursprünglichen Reihenfolge unterienander geschreiben werden.

sort -k1,1 <file>

leistet leider nicht den gewünschten Umfang, da doppelte Werte in der Spalte 1 trotzdem sortiert nach Kriterium Spalte 2 ausgegeben werden.

Wie bewerkstellige ich meine Anforderung mit sort?

Vielen Dank,
sv

zst
13-04-2010, 18:44
Hallo,
zeig uns doch mal ein Beispiel, also einen IST-Stand und auch einen SOLL-Stand.
Dann kann man das mal praktisch für Dich probieren.
Gruß zst

msi
13-04-2010, 22:32
stellst du dir sowas vor:



perl -F, -ane 'push @{$h{$F[0]}},$_ }{ print @{$h{$_}} foreach sort{ $a <=> $b } keys(%h)' DATEINAME

superviser
14-04-2010, 07:53
@msi: Ich verstehe deinen Code leider nicht.

Das Schema der Ausgangsdatei:



1 0.5
2 3
3 5
4 8
2 2
3 4


Gewünschtes Ergebnis:



1 0.5
2 3
2 2
3 5
3 4
4 8


Hab es wie gesagt mit
sort -k1,1 probiert, leider sieht das Ergebnis dann so aus:



1 0.5
2 2
2 3
3 4
3 5
4 8


Was kann ich tun?

zst
14-04-2010, 19:29
Hallo superviser,
das Problem ist interessant. Du hast eigentlich die richtige Lösung, nur leider funktioniert sie nicht. Über einen Umweg geht es aber schon.
Nehmen wir an, Deine Datei heißt "DEINEDATEI".
Dann funktioniert es so zum Beispiel:


nl DEINEDATEI | sort -k 2,2 | cut -f2-


Das Ergebnis ist dann:
1 0.5
2 3
2 2
3 5
3 4
4 8

Keine schöne Lösung, aber immerhin. Vielleicht hat ja noch jemand eine Idee für Dich.
Gruß zst

jeebee
14-04-2010, 19:53
wieso verwendest du nicht einfach die --stable (-s) Option von sort? Damit klappts jedenfalls bei mir:
sort -k 1,1 -s input

zst
14-04-2010, 20:10
Hallo jeebee,

GENIAL !!!
Das ist es.

superviser
14-04-2010, 20:24
Vielen vielen Dank an euch beide.

Die stabile Version ist natürlich die Elegantere. ;)

Funktioniert auch für meinen Anwendungsfall tadellos. Kannst mit noch erklären was da genau passiert? Werde aus der man nicht richtig schlau. Was bedeutet "disabling last-resort"? Wird da immer der von -k nicht umfasste Bereich von der Sortierung ausgeschlossen?

msi
14-04-2010, 23:27
echo "1 0.5
2 3
3 5
4 8
2 2
3 4" |
perl -ane 'push @{$h{$F[0]}},$_ }{ print @{$h{$_}} foreach sort{ $a <=> $b } keys(%h)'


funktioniert bei mir wuderbar, das Trennzeichen (mit -F ) hatte ich im ersten Posting auf , gesetzt gehabt. Wenn du den Parameter weglässt werden Leerzeichen verwendet.

jeebee
15-04-2010, 09:46
stable sort bedeutet, dass wenn zwei Einträge den gleichen Key haben, diese in der Original-Reihenfolge im Resultat erscheinen.