Batch Werte in 2 CSV-Dateien summieren

Eremit_

Lt. Junior Grade
Registriert
Okt. 2007
Beiträge
259
Hallo,
ich erhalte von meinen Solarwechselrichtern 2 CSV-Dateien.

Datei1:
Code:
;SB5000TL-21;SB5000TL-21
;Total yield;Power
;Counter;Analog
dd/MM/yyyy HH:mm:ss;kWh;kW
10/10/2013 09:00:00;8945,271;1,368
10/10/2013 09:05:00;8945,393;1,464
10/10/2013 09:10:00;8945,518;1,500
10/10/2013 09:15:00;8945,651;1,596
10/10/2013 09:20:00;8945,790;1,668
10/10/2013 09:25:00;8945,923;1,596
10/10/2013 09:30:00;8946,073;1,800

Datei2:
Code:
;SB4000TL-20;SB4000TL-20
;Total yield;Power
;Counter;Analog
dd/MM/yyyy HH:mm:ss;kWh;kW
10/10/2013 09:00:00;8431,159;0,936
10/10/2013 09:05:00;8431,301;1,704
10/10/2013 09:10:00;8431,468;2,004
10/10/2013 09:15:00;8431,646;2,136
10/10/2013 09:20:00;8431,845;2,388
10/10/2013 09:25:00;8432,038;2,316
10/10/2013 09:30:00;8432,259;2,652


Habe es nun schon mit awk, cut, pr, paste und curl versucht aber so richtig komme ich da noch nicht durch.

Nur benötige ich als Ergebnis eine neue CSV-Datei mit folgendem Inhalt:
Uhrzeit (Stunden:Minuten), und den KW-Wert als Summe aus den beiden Dateien:
09:20;4,056


Vielleicht noch eine andere Idee? Ich denke mit cut und paste -d sollte es gehen.

Nur wie?


Eremit_



Edit:
Mittlerweile habe ich die Uhrzeit und die beiden Werte hintereinander:
Code:
paste -d";" <(cut -c 11-16 $DATEI1) <(cut -c 30-36 $DATEI1 | tr ',' '.' ) <(cut -c 30-36 $DATEI2 | tr ',' '.'  )   > Test.csv

Ergebnis:
09:20;2.388;1.668

Nur müssen die beiden Werte noch Summiert werden.....
 
Zuletzt bearbeitet:
Code:
paste -d";" <(cut -c 12-16 $DATEI1) <(cut -c 30-36 $DATEI1) <(cut -c 30-36 $DATEI2) | awk -F ";" '/[0-9]{2}:[0-9]{2}/ {print $1";"$2+$3}' > Test.csv

Ist jetzt mit , statt . sonst bekommt awk das nicht gebacken das zu addieren.
 
Zuletzt bearbeitet: (kleine Vereinfachung)
Hallo,

danke für die Lösung.
Leider funktioniert sie bei mir nicht und die Datei bleibt leer.

Bin mir auch nicht sicher ob das awk einfach so dahinter geschrieben werden darf und wie nun die "Leserichtung" der Zeile ist.

Eremit_
 
Zu beachten ist vielleicht, dass du in dem ersten cut von 11-16 selektiert hast. Die 11. Stelle ist jedoch nur ein Leerzeichen weshalb ich die weggelassen hab. Eigentlich müsste der regex in awk aber trotzdem matchen. Ich kann nur sagen, dass es bei mir perfekt funktioniert. (Edit: das folgende scheint nicht zu stimmen)Bist du dir sicher, dass die Variablen $DATEI1 und 2 richtig gesetzt sind? In Klammern wird glaube ich eine neue Shell gestartet und es könnte sein, dass die dort nicht belegt sind.
 
Zuletzt bearbeitet:
Hallo,

den Startwert für cut habe ich auf 12 korrigiert.
Die Variablen $Datei1 und 2 sind korrekt deklariert und ich kann damit auch auf die passenden Werte zugreifen.

Bin auch gerade mit awk beschäftigt und versuche mich gerade an folgendes:

Code:
$ paste fa.txt fb.txt fc.txt | awk '{print "("$1"+"$2"-"$3")="$1+$2-$3}'
Output:
(20+60-70)=10
(60+90-90)=60
(90+12-80)=22
(12+14-12)=14

Damit müsste es irgendwie gehen.
 
Lass am besten mal das awk weg und guck was dann auf der Konsole steht. So können wir das Problem schonmal eingrenzen.

Code:
paste -d";" <(cut -c 12-16 $DATEI1) <(cut -c 30-36 $DATEI1) <(cut -c 30-36 $DATEI2)
 
13:50;2,460;2,712
13:55;3,336;3,756
14:00;3,240;3,696
14:05;3,144;3,576
14:10;3,036;3,480
14:15;2,880;3,360
14:20;2,784;3,300
14:25;2,784;3,360
14:30;1,788;2,196
14:35;2,448;2,940
14:40;2,712;3,384
14:45;1,980;2,484

...Also die Werte so wie sie sein sollen.
Nun noch addieren.

Eremit_


Folgendes geht aber nun:

......... | awk -F";" '{printf $1";"($2*1000)+($3*1000)"\n"}'


Code:
16:25;276
16:30;252
16:35;240
16:40;264
16:45;264
16:50;276
16:55;288
17:00;264
17:05;264
17:10;360
17:15;456
 
Zuletzt bearbeitet:
Ich hab das auch gerade in einem Online Bash Interpreter getestet und irgendwie verschluckt er sich da auch an dem regex. Komisch, dass es bei mir geht.
Naja wenn du wirklich nur die Zeilen hast die du bearbeiten willst, kannst du den natürlich weglassen. Was genau willst du denn berechnen, da du jetzt mit 2000 und 1000 multipliziert hast? Falls es an der Ganzzahlarithmetik liegt, musst du vorher die , doch noch durch . ersetzen. Was als Trennzeichen angesehen wird hängt von der locale hab.
 
Zuletzt bearbeitet:
Mittlerweile bin ich auch etwas weiter.
Mit dem "*2000" war ein versehen.

Jetzt nur noch die Frage wie ich in das printf eine externe Variable reinbekomme....
Die will er bei mir einfach nicht einbringen.
.... awk -F";" '{printf ($Extern1+$2)"\n"}'


Eremit_
 
Innerhalb von ' werden Shellvariablen im Gegensatz zu " nicht ersetzt. Daher schreibt man um den awk-Block auch die ' damit da keine Konflikte mit den Variablen entstehen. Das müsstest du dann wie folgt zusammensetzen

Code:
.... awk -F";" '{printf ('$Extern1'+$2)"\n"}'
 
.... awk -F";" '{printf ('$Startwert1')"\n"}'
echo $Startwert1


Ergibt:
....
8430.87
8430.87
8430.87
8430.87
8430.87
8430.874

Warum es hier dann 3 Kommastellen gibt und in der printf nicht ist mir ein Rästel.
An sich funktioniert der Zugriff aber.
 
Da müsstest du mal in die printf Doku von awk gucken. Das ist ja dafür da unter anderem die Nachkommastellen einzustellen. Standardmäßig steht das wohl auf 2.
Ergänzung ()

So sollte es für 3 Nachkommastellen aussehen.
Code:
awk -F";" '{printf ("%.3f", '$Startwert1')"\n"}'
 
Zuletzt bearbeitet:
(paste -d";" <(cut -c 12-16 $DATEI1) <(cut -c 21-28 $DATEI1 | tr ',' '.') <(cut -c 21-28 $DATEI2) | tr ',' '.') | awk -F";" '{printf "%s;%.3f\n",$1,($2-'$Startwert1'+$3-'$Startwert2')}' > $DATEITEMP


Das ist sie!!!
Beide Wechselrichter werden zusammengezählt und von den beiden Grundbasiswerten abgezogen.


Code:
12:00;16.935
12:05;17.581
12:10;18.250
12:15;18.825
12:20;18.932
12:25;19.164
12:30;19.794
12:35;20.345
12:40;20.807
12:45;21.412
12:50;21.814
12:55;22.273


@Freezedevil
:-)
Vielen Dank. Ohne deine Hilfe hätte ich das nicht hinbekommen.

Danke.

Eremit_
 
Man hilft doch gern. Du kannst den Befehl noch ein bisschen kürzen indem du die Ersetzung von , durch . nur einmal machst bevor du es in awk steckst.

Code:
(paste -d";" <(cut -c 12-16 $DATEI1) <(cut -c 21-28 $DATEI1) <(cut -c 21-28 $DATEI2)) | tr ',' '.' | awk -F";" '{printf "%s;%.3f\n",$1,($2-'$Startwert1'+$3-'$Startwert2')}' > $DATEITEMP

Ich hab das jetzt nicht gestestet, aber es sollte funzen.
 
Zurück
Oben