Ausgabe gruppieren und sortieren

litrax

litrax

Grünschnabel
Hallo zusammen,

ich benötige mal Hilfe bei einer nicht ganz alltäglichen Aufgabe:

Ich habe eine Ausgabe die so aussieht:

/tmp/babxyz/bxyz654321
/tmp/aabxyz/axyz654321
/tmp/aabxyz/axyz123456
/tmp/babxyz/bxyz123456
/tmp/abaxyz0/axyz654321
/tmp/abaxyz/axyz123456
/tmp/dbaxyz0/dxyz654321
/tmp/bbaxyz/bxyz123456
/tmp/bbaxyz/bxyz654321
/tmp/cbaxyz/cxyz123456

Diese möchte ich nicht nur nach dem letzten Feld (z.B. cxyz123456) sortieren sondern zunächst mal gruppieren. Und zwar nach dem 2. Feld. Ausserdem soll der erste Buchstabe der Sortierfelder ignoriert werden.

Also: Gruppierung und Sortierung nach dem 2. Feld (ohne 1. Buchstabe): abxyz, baxyz, usw.
Dann innerhalb der Gruppe (z.B. abxyz) Sortierung des 3. Felds (ohne 1. Buchstaben): /tmp/aabxyz/axyz123456, /tmp/babxyz/bxyz123456


Das Ganze soll dann so aussehen:

/tmp/aabxyz/axyz123456
/tmp/babxyz/bxyz123456
/tmp/aabxyz/axyz654321
/tmp/babxyz/bxyz654321

/tmp/abaxyz/axyz123456
/tmp/bbaxyz/bxyz123456
/tmp/cbaxyz/cxyz123456
/tmp/abaxyz0/axyz654321
/tmp/bbaxyz/bxyz654321
/tmp/dbaxyz0/dxyz654321

Wie gesagt eine Sortierung nach dem 2. oder dem 3. Feld bekomme ich noch hin aber mit dem Auslassen des 1. Buchstaben des Sortierfeldes UND mit der Gruppierung nach Feld 2 UND der Sortierung nach Feld 3 (ohne 1. Buchstaben) innerhalb der Gruppe tue ich mich schwer. Ich hoffe ich habe mich verständlich ausgedrückt. Ansonsten einfach nachfragen...

Kann mir da jemand helfen?

Gruss
Litrax
 
Code:
bitmuncher@mbp2:~/tmp> cat list.txt
/tmp/babxyz/bxyz654321
/tmp/aabxyz/axyz654321
/tmp/aabxyz/axyz123456
/tmp/babxyz/bxyz123456
/tmp/abaxyz0/axyz654321
/tmp/abaxyz/axyz123456
/tmp/dbaxyz0/dxyz654321
/tmp/bbaxyz/bxyz123456
/tmp/bbaxyz/bxyz654321
/tmp/cbaxyz/cxyz123456

bitmuncher@mbp2:~/tmp> cat sort_list.pl
#!/usr/bin/env perl

my $listfile = 'list.txt';
open(LISTFILE, $listfile) or die "Couldn't open $listfile: $!\n";
my @list_arr = <LISTFILE>;
close(LISTFILE);

my %end_hash;
my $i=0;
foreach my $line (@list_arr) {
	if ($line =~ /\/tmp\/.(.*)\/(.*)/) {
		$end_hash{$1}[$i] = $2;
	}
	$i++;
}

foreach my $key1 (sort keys %end_hash) {
	foreach my $key2 (sort @{$end_hash{$key1}}) {
		if (!$key2) {
			next;
		}
		print '/tmp/'.$key1.'/'.$key2."\n";
	}
}

1;

bitmuncher@mbp2:~/tmp> ./sort_list.pl
/tmp/abxyz/axyz123456
/tmp/abxyz/axyz654321
/tmp/abxyz/bxyz123456
/tmp/abxyz/bxyz654321
/tmp/baxyz/axyz123456
/tmp/baxyz/bxyz123456
/tmp/baxyz/bxyz654321
/tmp/baxyz/cxyz123456
/tmp/baxyz0/axyz654321
/tmp/baxyz0/dxyz654321

Keine schöne Lösung, aber sollte erstmal funktionieren.
 
Vielen Dank,

dass ist ungefähr das was ich wollte.

Nur ein kniffliges Problem hab ich noch:
die 3. Spalte (axyz123456):

Ich würde gerne ohne den 1. Buchstaben sortieren, ihn aber mit ausgeben.
Also laut Sortierung sollen innerhalb der Spalte 2 ( abxyz ) alle xyz123456 untereinander stehen, aber mit dem 1. Buchstaben ausgegeben werden (axyz123465).

IST nach Anwendung des Perlscripts:

/tmp/abxyz/axyz123456
/tmp/abxyz/axyz654321
/tmp/abxyz/bxyz123456
/tmp/abxyz/bxyz654321

SOLL:

/tmp/abxyz/axyz123456
/tmp/abxyz/bxyz123456
/tmp/abxyz/axyz654321
/tmp/abxyz/bxyz654321

Ich hab jetzt einfach mal die Zeile
Code:
if ($line =~ /\/tmp\/.(.*)\/(.*)/) {
in
Code:
if ($line =~ /\/tmp\/.(.*)\/.(.*)/) {
geändert, aber dann wird mir die (eigentlich wichtige) Info des 1. Buchstabens der 3. Spalte abgeschnitten:

/tmp/abxyz/xyz123456
/tmp/abxyz/xyz123456
/tmp/abxyz/xyz654321
/tmp/abxyz/xyz654321


Jemand einen Verbesserungsvorschlag?
 
Pack das einzelne Zeichen mit in's Hash als extra Wert. Dann steht es dir bei der Ausgabe zur Verfügung.
 
Nachtrag: Alternativ kannst du das einzelne Zeichen auch noch vor der Ausgabe "extrahieren". Dürfte vermutlich der einfachere Weg sein.

Code:
#!/usr/bin/env perl

my $listfile = 'list.txt';
open(LISTFILE, $listfile) or die "Couldn't open $listfile: $!\n";
my @list_arr = <LISTFILE>;
close(LISTFILE);

my %end_hash;
my $i=0;
foreach my $line (@list_arr) {
	if ($line =~ /\/tmp\/.(.*)\/(.*)/) {
		$end_hash{$1}[$i] = $2;
	}
	$i++;
}

foreach my $key1 (sort keys %end_hash) {
	foreach my $key2 (sort @{$end_hash{$key1}}) {
                my $firstchar;
		if (!$key2) {
			next;
		}
                if ($key2 =~ /(.).*/) {
                        $firstchar = $1;
                        print $firstchar.' ist das erste Zeichen der 3. Spalte.'."\n";
                }
		print '/tmp/'.$key1.'/'.$key2."\n";
	}
}

1;
 

Ähnliche Themen

Finde Fehler im Code nicht

bash: Fehlermeldung und Werte in Array sortieren?

Ausgabe auswerten und reagieren

C++ Klausur durchgefallen

wer kann mir anhand eines beispiels mein problem lösen

Zurück
Oben