Ausgabe gruppieren und sortieren

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von litrax, 30.10.2013.

  1. litrax

    litrax Grünschnabel

    Dabei seit:
    19.04.2013
    Beiträge:
    3
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bitmuncher, 30.10.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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.
     
  4. litrax

    litrax Grünschnabel

    Dabei seit:
    19.04.2013
    Beiträge:
    3
    Zustimmungen:
    0
    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?
     
  5. #4 bitmuncher, 31.10.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    Pack das einzelne Zeichen mit in's Hash als extra Wert. Dann steht es dir bei der Ausgabe zur Verfügung.
     
  6. #5 bitmuncher, 31.10.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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;
    
     
Thema:

Ausgabe gruppieren und sortieren

Die Seite wird geladen...

Ausgabe gruppieren und sortieren - Ähnliche Themen

  1. Kurztipp: Unerwünschte grep-Ausgaben vermeiden

    Kurztipp: Unerwünschte grep-Ausgaben vermeiden: Selbst aus altbekannten Programmen kann man oft noch einiges mehr herausholen - man muss sich nur einmal gründlich mit ihnen auseinandersetzen....
  2. Ausgabe von mkdir -p wegwerfen

    Ausgabe von mkdir -p wegwerfen: Hallo, ich stehe gerade auf den schlauch. in meinen BASH Script lege ich mit mkdir -p ein verzeichnis an. Das Script gibt dann immer auf der...
  3. Unix Shell echo/ausgabe solange Bedingung ...

    Unix Shell echo/ausgabe solange Bedingung ...: Hallo liebe Unix User, da ich relativ neu bin, was Linux / Unix angeht stehe ich gerade komplett auf dem Schlauch! Problem: Aus mehreren...
  4. »Einführung in Tcl/Tk« in neuer Ausgabe

    »Einführung in Tcl/Tk« in neuer Ausgabe: Das Buch »Einführung in Tcl/Tk« wendet sich an Anfänger, die die Programmiersprache Tcl/Tk erlernen wollen. Der Titel kann kostenlos für die...
  5. PHP 6 oder 7: Debatte über die Versionierung der nächsten Ausgabe von PHP

    PHP 6 oder 7: Debatte über die Versionierung der nächsten Ausgabe von PHP: In der Community der Scriptsprache PHP, die zur Erstellung dynamischer Webseiten und Webanwendungen dient, wird gerade kontrovers diskutiert,...