Mailinglist Archive: opensuse-de (1791 mails)

< Previous Next >
Re: Grundsatzfrage: sort
  • From: David Haller <lists@xxxxxxxxxx>
  • Date: Sun, 5 Nov 2006 00:43:28 +0000 (UTC)
  • Message-id: <20061104212246.GA12132@xxxxxxxxxxxxxxxxxx>
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

< Previous Next >
Follow Ups