su18 Geschrieben 10. Juli 2012 Teilen Geschrieben 10. Juli 2012 Hi, ich habe ein Problem mit einem Bash Script und hoffe hier etwas Hilfe zu finden. Folgende Daten in einer Datei habe ich als Basis: Cuser1 BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|CCC BLA1|BLUB1|CCC BLA1|BLUB1|CCC Cuser2 BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|YYY BLA1|BLUB1|CCC Cuser3 [....] BLA1 und BLUB1 sind immer verschieden. Man kann darauf also nicht matchen. Ich möchte nun hinbekommen, dass mir folgendes angezeigt wird: User 1 hat 11 "wasauchimmer" (die summe von allen XXX,YYY und CCC des einzelnen Users) User 2 hat 4 "wasauchimmer" (die summe von allen XXX,YYY und CCC des einzelnen Users) usw. Ich hab schon ein wenig hier mit rumexperimentiert: sed -n '/Cuser/{p; :a; N; /Cuser/!ba}; P' DATEI - das sollte mir einzeigen was zwischen zwei CuserX Einträgen steht. Da stecke ich nun aber fest und hoffe auf Hilfe Gruß und danke Seb Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 10. Juli 2012 Teilen Geschrieben 10. Juli 2012 Hi, ich verstehe deine Problem, wobei ich mich gerade frage, ob das überhaupt so möglich ist ohne Schleife. Ich denke nicht. Denn angenommen es würde gehen, würde ja eigentlich nur die Datei angezeigt OHNE Cuser[0-9]. Das ist aber doch nicht das, was du möchtest. Muss das denn ein Einzeiler sein? EDIT: Und außerdem stehen die Angaben des letzten Users ja nicht ZWISCHEN zwei Cuser-Einträgen und würden somit gar nicht mit ausgegeben/gezählt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 10. Juli 2012 Teilen Geschrieben 10. Juli 2012 Offtopic: Muss das zwangsweise Bash sein? Es gibt doch Ruby, Python, Perl und anderes ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
su18 Geschrieben 11. Juli 2012 Autor Teilen Geschrieben 11. Juli 2012 danke für eure Antworten. nein, es muss kein Einzeiler sein und auch die "Sprache" ist egal....bash ist nur das, was ich noch am besten kann. Daher hab ich es erstmal damit probiert. Wenn jemand eine Idee in einer anderen Sprache hat, bin ich auch nicht abgeneigt Gruß Seb Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
su18 Geschrieben 11. Juli 2012 Autor Teilen Geschrieben 11. Juli 2012 ich bin jetzt vielleicht schon etwas weiter. mit: sed -e '0,/Cuser/ d' -e '/Cuser/,$ d' Datei bekomme ich schon mal alles zwischen den ersten beiden Cuser einträgen. mit: sed -e '1,/Cuser/ d' -e '/Cuser/,$ d' Datei bekomme ich dann alles zwischen den nächsten beiden. Das klappt so lange, bis es keine zwei Cuser mehr gibt. Ich sollte noch erwähnen, dass das Ende der Datei auch markiert ist. so (mit END): Cuser1 BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|CCC BLA1|BLUB1|CCC BLA1|BLUB1|CCC Cuser2 BLA1|BLUB1|XXX BLA1|BLUB1|XXX BLA1|BLUB1|YYY BLA1|BLUB1|CCC Cuser3 BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|YYY BLA1|BLUB1|CCC END [....] jetzt hänge ich halt hier....weiss auch nicht, ob das der sauberste Ansatz ist. Danke und Gruß Seb Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
habbeda Geschrieben 12. Juli 2012 Teilen Geschrieben 12. Juli 2012 Wenn jemand eine Idee in einer anderen Sprache hat, bin ich auch nicht abgeneigt Dann mal schnell in Perl dahingeschrieben Da mir unklar ist, was mit die summe von allen XXX,YYY und CCC des einzelnen Users gefordert ist, habe ich jetzt einfach mal alles aufsummieren lassen. #!/usr/bin/perl use strict; use warnings; my $aktueller_benutzer = ""; # Variable, um aktuellen Benutzer zu merken my %benutzer_daten = (); # Hash für Speicherung der Daten open(FILE, "<##Dateiname##"); # Datei öffnen while (my $line = <FILE>) # Inhalt der Datei zeilenweise einlesen { chomp($line); # Zeilenumbruch entfernen if ($line =~ m/END/) # Ende der Datei { last; # Abbruch der Schleife } unless ($line =~ m/\|/) # Zeile mit Benutzernamen enthält kein Pipe-Symbol { $aktueller_benutzer = $line; } elsif ($aktueller_benutzer) { my @data = split("|", $line); # Zeile am Pipe-Symbol auftrennen # letzten Wert aufsummieren $benutzer_daten{$aktueller_benutzer}->{'summe'} += $data[-1]; # Anzahl der Datensätze inkrementieren $benutzer_daten{$aktueller_benutzer}->{'anzahl'}++; } } close(FILE); # Datei schließen # Ausgabe aufsteigend nach Benutzernamen sortiert foreach my $benutzer (sort keys %benutzer_daten) { print $benutzer . " hat " . $benutzer_daten{$benutzer}->{'anzahl'} . " \"" . $benutzer_daten{$benutzer}->{'summe'} . "\"\n"; } [/php] Vorsicht: nur schnell hingetippt (geht wahrscheinlich auch schöner) und lediglich Syntax geprüft Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.