Zum Inhalt springen

Problem bei Umsetzung von Bash Script


su18

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...