Hallo Leute, ich habe hier ein Problem mit sort - unabhängig von der verwendeten Distri bzw. Version. Laut meinen "Linup Front"-Unterlagen unterstützt sort mehrere "-k"-Angaben. Um also eine Datei zuerst nach Spalte 3 und anschliessend nach Spalte 5 zu sortieren benutze ich folgenden sort-Aufruf: $ sort -bif -t: -k 3 -k 5 ~/testdatei.txt oder alternativ: $ sort -bif -t: -k 3,5 ~/testdatei.txt Allerdings ignoriert sort die zweite Spaltenangabe einfach. Es kommt zwar keine Fehlermeldung, aber die 5. Spalte bleibt unsortiert. Auch die alte Option "+" habe ich schon erfolglos ausprobiert. Kofler und diverse Onlinequellen haben mich leider auch nicht weitergebracht. Hat hier vllt. jemand einen Tip ob der Fehler vor dem Rechner, bei sort oder bei den "Linup Front"-Unterlagen sitzt? Gruss Mario -- PN bitte an mario at vdlinde punkt org - PN an die Listenadresse werden automatisch vom SA entsorgt und werden nur zufällig von mir gelesen!
Hallo, Am Sam, 04 Nov 2006, Mario van der Linde schrieb:
Um also eine Datei zuerst nach Spalte 3 und anschliessend nach Spalte 5 zu sortieren benutze ich folgenden sort-Aufruf: $ sort -bif -t: -k 3 -k 5 ~/testdatei.txt oder alternativ: $ sort -bif -t: -k 3,5 ~/testdatei.txt
Allerdings ignoriert sort die zweite Spaltenangabe einfach. Es kommt zwar keine Fehlermeldung, aber die 5. Spalte bleibt unsortiert.
Das haengt natuerlich von der Art der Spalten ab. Hier mit einem sort (GNU textutils) 2.0.10 funktioniert es z.B.: for i in 1 2 3 4; do for j in 2 4 3 1; do echo "a ${j} b ${i} c"; done; done | sort -n -k2,4 a 1 b 1 c a 1 b 2 c a 1 b 3 c a 1 b 4 c a 2 b 1 c a 2 b 2 c a 2 b 3 c [..] -dnh -- Reporter (to Mahatma Gandhi): Mr Gandhi, what do you think of Western Civilization? Gandhi: I think it would be a good idea.
Am Samstag, 4. November 2006 17:46 schrieb David Haller:
Das haengt natuerlich von der Art der Spalten ab. Hier mit einem sort (GNU textutils) 2.0.10 funktioniert es z.B.:
for i in 1 2 3 4; do for j in 2 4 3 1; do echo "a ${j} b ${i} c"; done; done | sort -n -k2,4 [...]
Nun ja, mal abgesehen davon, dass Dein Beispiel auch mit "sort -n" (also ohne -k) die gleiche Sortierung abliefert ;), hilft mir das nicht weiter. Mit der Option -n oder -g wird -t: ignoriert (die ganze Zeile wird als ein Feld betrachtet), mit -bif wird die zweite Spalte ignoriert: $ sort -t: -k3,5 test.dat Jumpabout:Mike:Fairing Track Society:154:Men de Leaping:Gwen:Fairing Track Society:26:Ladies O'Finnan:Jack:Fairing Track Society:45:Men Runnington:Vivian:Lameborough TFC:117:Ladies [...] oder $ sort -n -t: -k3,5 test.dat de Leaping:Gwen:Fairing Track Society:26:Ladies Fleetman:Fred:Rundale Sportsters:217:Men Jumpabout:Mike:Fairing Track Society:154:Men Longshanks:Loretta: Pantington AC:55:Ladies [...] und herauskommen sollte eigentlich dieses: de Leaping:Gwen:Fairing Track Society:26:Ladies Jumpabout:Mike:Fairing Track Society:154:Men O'Finnan:Jack:Fairing Track Society:45:Men Runnington:Vivian:Lameborough TFC:117:Ladies [...] Und nu? Gruss Mario -- PN bitte an mario at vdlinde punkt org - PN an die Listenadresse werden automatisch vom SA entsorgt und werden nur zufällig von mir gelesen!
Mario van der Linde wrote:
[...] $ sort -t: -k3,5 test.dat Jumpabout:Mike:Fairing Track Society:154:Men de Leaping:Gwen:Fairing Track Society:26:Ladies O'Finnan:Jack:Fairing Track Society:45:Men Runnington:Vivian:Lameborough TFC:117:Ladies [...]
Das ist fuer die gemachten Angaben eine korrete Sortierung.
[...] und herauskommen sollte eigentlich dieses:
de Leaping:Gwen:Fairing Track Society:26:Ladies Jumpabout:Mike:Fairing Track Society:154:Men O'Finnan:Jack:Fairing Track Society:45:Men Runnington:Vivian:Lameborough TFC:117:Ladies [...]
Du sitzt da glaube ich einem Gedankenfehler auf. Die Option "-k3,5" besagt *nicht*, dass zuerst nach Spalte 3, dann nach Spalte 5 sortiert wird. Die Option besagt, dass nach den Spalten 3 *bis* 5 sortiert wird (RTFM). Deswegen ist erste obige Variante auch ein korrektes Ergebnis fuer Deinen gegebenen Befehl. Was Du suchst, entspricht glaube ich eher dem folgenden Kommando: $> sort -t: -k3,3 -k5,5 test.dat Cheers, Th.
Am Samstag, 4. November 2006 21:49 schrieb Thomas Hertweck: [...]
Du sitzt da glaube ich einem Gedankenfehler auf. Die Option "-k3,5" [...]
$> sort -t: -k3,3 -k5,5 test.dat
Cheers, Th.
Du hast recht. Also saß der Fehler vor dem Computer... Danke Mario -- PN bitte an mario at vdlinde punkt org - PN an die Listenadresse werden automatisch vom SA entsorgt und werden nur zufällig von mir gelesen!
Hallo, Am Sam, 04 Nov 2006, Mario van der Linde schrieb: [..]
$ sort -n -t: -k3,5 test.dat de Leaping:Gwen:Fairing Track Society:26:Ladies Fleetman:Fred:Rundale Sportsters:217:Men Jumpabout:Mike:Fairing Track Society:154:Men Longshanks:Loretta: Pantington AC:55:Ladies [...] und herauskommen sollte eigentlich dieses:
de Leaping:Gwen:Fairing Track Society:26:Ladies Jumpabout:Mike:Fairing Track Society:154:Men O'Finnan:Jack:Fairing Track Society:45:Men Runnington:Vivian:Lameborough TFC:117:Ladies [...]
Du willst nach 'Men/Ladies' sortieren? Oder nach den Nummern? Für ersteres müsstest du die Felder umsortieren: awk -F: '{ printf("%s:%s:%s:%s:%i\n", $1, $2, $3, $5, $4); }' \ | sort -bfi -t: -k 3 \ | awk -F: '{printf("%s:%s:%s:%i:%s\n", $1, $2, $3, $5, $4); }' de Leaping:Gwen:Fairing Track Society:26:Ladies Jumpabout:Mike:Fairing Track Society:154:Men O'Finnan:Jack:Fairing Track Society:45:Men Runnington:Vivian:Lameborough TFC:117:Ladies Mit -k kannst du nur einen _Bereich_ auswaehlen, nicht einzelne Schlüssel. Wenn du aber eine Allzweckwaffe haben willst kann ich Perl empfehlen (zumindest wenn die Daten nicht allzugroß werden, aber das Problem hast du immer, wenn du sortieren willst). ==== #!/usr/bin/perl -w use strict; sub mysort { return $a->[2] cmp $b->[2] || $a->[4] cmp $b->[4]; ### numerischer Vergleich Feld 4 waere: $a->[3] <=> $b->[3] ### erstes Kriterium || zweites || ... || ntes Kriterium ### siehe perldoc -f sort } my @lines; while(<>) { chomp; push(@lines, [split(":",$_)]); } foreach ( sort mysort @lines ) { print join(":", @{$_}), "\n"; } 1; ==== Du kannst so nach beliebigen Kriterien sortieren. -dnh -- What's the speed limit on sex? 68. At 69, you have to turn around
David Haller wrote:
[...]
Mit -k kannst du nur einen _Bereich_ auswaehlen, nicht einzelne Schlüssel.
Deine Loesungen scheinen ziemlicher Overkill fuer das kleine Problem zu sein, das Mario loesen will. Du hast recht, dass mit einem einzelnen "-kPOS1,POS2" das Problem nicht zu loesen ist (weil es einen Bereich waehlt), aber ein "-k3,3 -k5,5" (siehe meine Email von gestern abend) sollte genau das tun, was Mario moechte. Soll irgendwo auch nach Zeile 4 numerisch sortiert werden, so hilft ein "-k4,4n". "info sort" listet sogar zahlreiche Beispiele auf: sort -t : -k 5b,5 -k 3,3n /etc/passwd sort -t : -n -k 5b,5 -k 3,3 /etc/passwd sort -t : -b -k 5,5 -k 3,3n /etc/passwd Cheers, Th.
Hallo, Am Son, 05 Nov 2006, Thomas Hertweck schrieb:
David Haller wrote:
[...] Mit -k kannst du nur einen _Bereich_ auswaehlen, nicht einzelne Schlüssel.
Deine Loesungen scheinen ziemlicher Overkill fuer das kleine Problem zu sein, das Mario loesen will.
ACK. Naja, mit der Perlvariante kann man eben auch ganz komisch "sortieren": my %rank = ( "/bin/sh" => 1, "/bin/bash" => 2, "/bin/zsh" => 3 ); sub mysort { # nach Feld 3 alphabetisch, a-z, dann numerisch nach Wert aus %rank return $a->[2] cmp $b->[2] || $rank{$b->[6]} <=> $rank{$a->[6]}; } Also, für verquastes sortieren kann man sich's ja mal merken bzw. das Perlfragment abspeichern. ;) -dnh, dem das mit den Modifiern fuer einzelne Felder beim sort unbekannt war ;) -- Lieber 'ne Latte in der Hose als ein Brett vorm Kopf. -- Adrian Knoth
participants (3)
-
David Haller
-
Mario van der Linde
-
Thomas Hertweck