Veröffentlicht 10. Juli 201213 j 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
10. Juli 201213 j 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.
10. Juli 201213 j Offtopic: Muss das zwangsweise Bash sein? Es gibt doch Ruby, Python, Perl und anderes ...
11. Juli 201213 j 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
11. Juli 201213 j 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
12. Juli 201213 j 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.