gregor-kiel
Anmeldungsdatum: 21. Juli 2006
Beiträge: 54
Wohnort: Kiel, GER
|
Hallo!
ich habe ein größeres Skript, das in Kurzform in etwa so aussieht: 1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/bash
DATEIEN=`ls ~/Pfad`
DATUM=17
for DATEI in $DATEIEN;
do # Schleife fuer jede Datei
cat $DATEI | while read line;
do # Schleife fuer alle Zeilen je Datei
DATUM=`date +%Y%m%d`
echo "DATUM (1) = $DATUM" # Ergibt ein Datum
done
echo "DATUM (2) = $DATUM" # Ergibt die 17 aus der Initialisierung
done
|
Warum wird DATUM nicht aus der inneren Schleife nach außen übergeben?
Bin für Hilfe dankbar!
Grüße, Gregor
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13211
|
gregor-kiel schrieb: Mach mal besser | for DATEI in ~/Pfad/*; do
|
Warum wird DATUM nicht aus der inneren Schleife nach außen übergeben?
Weil Dein Schleifenrumpf in einer anderen Shell läuft. Ciao robert
|
gregor-kiel
(Themenstarter)
Anmeldungsdatum: 21. Juli 2006
Beiträge: 54
Wohnort: Kiel, GER
|
Warum wird DATUM nicht aus der inneren Schleife nach außen übergeben?
Weil Dein Schleifenrumpf in einer anderen Shell läuft.
Und wie komme ich an die zu übergebenden Werte? Danke schon mal!
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
gregor-kiel schrieb: Warum wird DATUM nicht aus der inneren Schleife nach außen übergeben?
Weil Dein Schleifenrumpf in einer anderen Shell läuft.
Und wie komme ich an die zu übergebenden Werte? Danke schon mal!
Indem Du diese blöde Untershell weglässt. Die Zeile 7 mit cat $DATEI | while read line; ist sowieso keine gute Idee. Was willst Du eigentlich genau heraus bekommen, und was willst Du damit machen ? track
|
gregor-kiel
(Themenstarter)
Anmeldungsdatum: 21. Juli 2006
Beiträge: 54
Wohnort: Kiel, GER
|
Ich durchforste damit mehrere Logdateien (.csv) und stelle Berechnungen zwischen einzelnen Zeilen dieser Logs an.
Ich muss den letzten Zeitstempel innerhalb einer Datei für die nächste Datei kennen. Wie und womit kann ich den neuen fork verhindern/umgehen?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13211
|
track schrieb: gregor-kiel schrieb: Und wie komme ich an die zu übergebenden Werte? Danke schon mal!
Indem Du diese blöde Untershell weglässt. Die Zeile 7 mit cat $DATEI | while read line; ist sowieso keine gute Idee.
Genau! Dafür gibt's gleich mal einen useless use of cat award. 1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/bash
datum=$(date '+%Y%m%d')
for datei in ~/Pfad/*;
do # Schleife fuer jede Datei
while read line;
do # Schleife fuer alle Zeilen je Datei
echo "DATUM (1) = $datum" # Ergibt ein Datum
done < "$datei"
echo "DATUM (2) = $datum" # Ergibt die 17 aus der Initialisierung
done
|
Ciao robert
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13211
|
gregor-kiel schrieb: Ich durchforste damit mehrere Logdateien (.csv) und stelle Berechnungen zwischen einzelnen Zeilen dieser Logs an.
Ich muss den letzten Zeitstempel innerhalb einer Datei für die nächste Datei kennen. Wie und womit kann ich den neuen fork verhindern/umgehen?
Siehe mein anderes Posting. Generell könnte es aber besser sein, für so etwas awk zu nutzen. Ciao robert
|
gregor-kiel
(Themenstarter)
Anmeldungsdatum: 21. Juli 2006
Beiträge: 54
Wohnort: Kiel, GER
|
rklm schrieb: Siehe mein anderes Posting. Generell könnte es aber besser sein, für so etwas awk zu nutzen.
Welches anderes Posting?
Du hast mein Script jetzt schon ziemlich stark "optimiert", allerdings war das natürlich nur eine gekürzte Variante, um es möglichst übersichtlich erscheinen zu lassen. An Stelle von "cat" steht eine andere Aufbereitung. Und DATUM bekommt natürlich jeweils andere Werte aus den Dateien zugewiesen. Mit awk kann ich meine Zeilenweisen Berechnungen nicht durchführen. Wie komme ich an den Variableninhalt aus der inneren Schleife? Bzw, wie kann die innere Schleife aussehen, ohne das ein neuer Prozess gestartet wird?
Wie (welche Befehle) lässt sich die Variable z.B. als Systemvariable auslagern und später wieder einlesen?
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
gregor-kiel schrieb: ... Mit awk kann ich meine Zeilenweisen Berechnungen nicht durchführen.
Das kann ich mir eigentlich nicht vorstellen, denn awk kann beim Rechnen viel mehr als jede Shell, und es arbeitet grundsätzlich zeilenorientiert ! Wenn Du mir verrätst, welche Art Berechnungen das sind, kann ich Dir nachher auch konkrete Tips geben. (jetzt muss ich erstmal für 1½ Stunden weg) track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13211
|
gregor-kiel schrieb: rklm schrieb: Siehe mein anderes Posting. Generell könnte es aber besser sein, für so etwas awk zu nutzen.
Welches anderes Posting?
Dies.
Du hast mein Script jetzt schon ziemlich stark "optimiert", allerdings war das natürlich nur eine gekürzte Variante, um es möglichst übersichtlich erscheinen zu lassen. An Stelle von "cat" steht eine andere Aufbereitung. Und DATUM bekommt natürlich jeweils andere Werte aus den Dateien zugewiesen.
Dann solltest Du entweder das Original hier posten oder die verkürzte Version so anpassen, dass sie die wesentlichen Aspekte korrekt abbildet. Ansonsten stochern wir hier nur im Nebel.
Mit awk kann ich meine Zeilenweisen Berechnungen nicht durchführen.
Warum?
Wie komme ich an den Variableninhalt aus der inneren Schleife? Bzw, wie kann die innere Schleife aussehen, ohne das ein neuer Prozess gestartet wird?
Wie (welche Befehle) lässt sich die Variable z.B. als Systemvariable auslagern und später wieder einlesen?
Z.B. so: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | #!/usr/bin/dash
# create a named pipe
fifo="${TMP:-/tmp}/${0##*/}-$$"
mkfifo "$fifo" || exit
# ensure the named pipe is removed on process exit
trap 'rm "$fifo"' 0
# start a background command writing to the pipe
# important: open the pipe just once!
seq 1 10 > "$fifo" &
# now read from the pipe until EOF
# important: open the pipe just once!
while read line; do
echo "read: $line"
done < "$fifo"
# reap exit status of background process
# normally the process has ended already
# so wait will return immediately and not
# block
wait
|
Ciao robert Edit: Kommentare hinzugefügt.
|
gregor-kiel
(Themenstarter)
Anmeldungsdatum: 21. Juli 2006
Beiträge: 54
Wohnort: Kiel, GER
|
Hier das Originalskript das funktionieren könnte, wenn "DATUM_ALT" nach Zeile 239 noch existent wäre. @robert: Dein kurzes Skript übersteigt leider meine Kenntnisse, ich kann kaum eine Zeile interpretieren. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249 | #!/bin/bash
GAS_STROM_OUT='/home/gregor/Dropbox/.windows/EigeneDateien/Akkumatik/ELV_Logger_OpenFormat/Gas+Strom_LogViewer_import.csv'
DATEIEN=`ls /home/gregor/Dokumente/logs/Strom+Gas |grep ESADL`
#DATEIEN=`ls /home/gregor/Dokumente/logs/Strom+Gas/bck2 |grep ESADL`
echo "lösche alte .csv Dateien"
rm $GAS_STROM_OUT /home/gregor/Dokumente/logs/Strom+Gas/Stromverbrauch.csv /home/gregor/Dokumente/logs/Strom+Gas/Referenz.csv &> /dev/null
echo -e "zu verarbeitende Logger-Dateien:\n"
echo $DATEIEN
# ------------ Referenzwerte aus Tabelle extrahieren -------------
LANG=en_US.UTF-8
libreoffice --headless --convert-to csv /home/gregor/Dokumente/Stromverbrauch.ods --outdir /home/gregor/Dokumente/logs/Strom+Gas
LANG=de_DE.UTF-8
while read LINE
do
ZEITSTEMPEL=`echo $LINE | awk -F',' '{print $1}'`
STROM_AM_ZAEHLER=`echo $LINE | awk -F',' '{print $2}'`
GAS_AM_ZAEHLER=`echo $LINE | awk -F',' '{print $3}'`
UNIX_TIME=`date -d "$ZEITSTEMPEL" +%s`
echo "\$1;1;$UNIX_TIME;;;$STROM_AM_ZAEHLER;;0 # Referenz"
echo "\$2;2;$UNIX_TIME;;;$GAS_AM_ZAEHLER;;0 # Referenz"
done < <(tail -n +23 /home/gregor/Dokumente/logs/Strom+Gas/Stromverbrauch.csv) >> /home/gregor/Dokumente/logs/Strom+Gas/Referenz.csv
# -----------------------Ende Referenz -------------------------
STROM_ZEIT_VORHER=0
GAS_ZEIT_VORHER=0
STROM_VERBRAUCH_TAGESENDE=0
GAS_VERBRAUCH_TAGESENDE=0
STROM_GESAMT_LEISTUNG=0
STROM_GESAMT_LEISTUNG_VORTAG=0
GAS_CBM_GESAMT=0
GAS_CBM_GESAMT_VORTAG=0
DATUM_AKTUELL=0
DATUM_ALT=0
ZEIT_ALT_UNIXTIME=0
ZEIT_AKTUELL_UNIXTIME=0
ZEITSTEMPEL=0
for DATEI in $DATEIEN;
do # Schleife fuer jede Datei
echo "$DATEI gefunden"
echo "DATUM_ALT=$DATUM_ALT bei Beginn neuer Datei"
echo "# Beginn von $DATEI" >> $GAS_STROM_OUT
# -------------------------- Strom -------------------------
# Ausgabe für LogViewer
tail -n +2 $DATEI | while read line;
do # Schleife fuer alle Zeilen je Datei
# Auswerten für Datum
if [[ `echo $line|grep ';'` ]] ; then
ZEITSTEMPEL=`echo $line|awk -F";" '{printf "%s %s",$2,$3}'`
ZEIT_AKTUELL_UNIXTIME=`date -d "${ZEITSTEMPEL:6:4}/${ZEITSTEMPEL:3:2}/${ZEITSTEMPEL:0:2} ${ZEITSTEMPEL:11:8}" "+%s"`
DATUM_AKTUELL=`date --date "Jan 1, 1970 00:00:00 +0000 + $ZEIT_AKTUELL_UNIXTIME seconds" +%Y%m%d`
DATUM_ALT=`date --date "Jan 1, 1970 00:00:00 +0000 + $ZEIT_ALT_UNIXTIME seconds" +%Y%m%d`
if [[ $DATUM_AKTUELL -gt $DATUM_ALT ]] ; then
STROM_VERBRAUCH_TAGESENDE=`gawk "BEGIN {OFMT=\"%.3f\"; print ($STROM_GESAMT_LEISTUNG - $STROM_GESAMT_LEISTUNG_VORTAG) ;}"`
GAS_VERBRAUCH_TAGESENDE=`gawk "BEGIN {OFMT=\"%.3f\"; print ($GAS_CBM_GESAMT - $GAS_CBM_GESAMT_VORTAG) ;}"`
# debug
echo "Tagesumbruch erkannt"
# sleep 5
echo "DATUM_AKTUELL = $DATUM_AKTUELL"
echo "DATUM_ALT = $DATUM_ALT"
echo "STROM_GESAMT_LEISTUNG = $STROM_GESAMT_LEISTUNG"
echo "STROM_GESAMT_LEISTUNG_VORTAG = $STROM_GESAMT_LEISTUNG_VORTAG"
echo "STROM_VERBRAUCH_TAGESENDE = $STROM_VERBRAUCH_TAGESENDE"
echo "GAS_CBM_GESAMT = $GAS_CBM_GESAMT"
echo "GAS_CBM_GESAMT_VORTAG = $GAS_CBM_GESAMT_VORTAG"
echo "GAS_VERBRAUCH_TAGESENDE = $GAS_VERBRAUCH_TAGESENDE"
echo ""
GAS_CBM_GESAMT_VORTAG=$GAS_CBM_GESAMT
STROM_GESAMT_LEISTUNG_VORTAG=$STROM_GESAMT_LEISTUNG
TAGESENDE_UNIXTIME=`date -d "${DATUM_AKTUELL:0:4}/${DATUM_AKTUELL:4:2}/${DATUM_AKTUELL:6:2} 00:00:00" "+%s"`
echo "\$1;1;$TAGESENDE_UNIXTIME;;;;$STROM_VERBRAUCH_TAGESENDE;0 # Tagesverbrauch" >> $GAS_STROM_OUT
echo "\$2;2;$TAGESENDE_UNIXTIME;;;;$GAS_VERBRAUCH_TAGESENDE;0 # Tagesverbrauch" >> $GAS_STROM_OUT
echo "# Ab hier Datum = $DATUM_AKTUELL" >> $GAS_STROM_OUT
fi
ZEIT_ALT_UNIXTIME=$ZEIT_AKTUELL_UNIXTIME
fi
# Auswerten der Werte für Strom
if [[ `echo $line|grep Strom` ]] ; then
STROM_GESAMT_IMPULSE=`echo $line|cut -d\; -f14`
STROM_IMPULSE=`echo $line|cut -d\; -f15`
STROM_ZEITSTEMPEL=`echo $line|awk -F";" '{printf "%s %s",$2,$3}'`
STROM_UNIXTIME=`date -d "${STROM_ZEITSTEMPEL:6:4}/${STROM_ZEITSTEMPEL:3:2}/${STROM_ZEITSTEMPEL:0:2} ${STROM_ZEITSTEMPEL:11:8}" "+%s"`
STROM_ZEIT_AKTUELL=$STROM_UNIXTIME
STROM_LEISTUNG=`gawk "BEGIN {OFMT=\"%.1f\"; print ($STROM_IMPULSE*(1/1000))/($STROM_ZEIT_AKTUELL - $STROM_ZEIT_VORHER)*3600*1000 ;}"`
STROM_GESAMT_LEISTUNG=`gawk "BEGIN {OFMT=\"%.2f\"; print ($STROM_GESAMT_IMPULSE*(1/1000)) ;}"`
# Time --> Epoche
# date -d "12/21/2012 23:38:19" +%s
# Epoche --> Time
# date --date "Jan 1, 1970 00:00:00 +0000 + 1356129432 seconds"
#korrektur der erfassten Werte um Offset (reeller Zählerstand)
STROM_DELTA=0
if (( $STROM_UNIXTIME >= "1356129499" )); then STROM_DELTA="947.4"; fi # ESAD001
# if (( $STROM_UNIXTIME >= "1356170266" )); then STROM_DELTA="947.4"; fi # ESAD002
# if (( $STROM_UNIXTIME >= "1356195847" )); then STROM_DELTA="947.4"; fi # ESAD003
if (( $STROM_UNIXTIME >= "1356196463" )); then STROM_DELTA="948.4"; fi # ESAD004
# if (( $STROM_UNIXTIME >= "1356248433" )); then STROM_DELTA="948.4"; fi # ESAD005
if (( $STROM_UNIXTIME >= "1356252860" )); then STROM_DELTA="962.5"; fi # ESAD005 ab Zeile 60
if (( $STROM_UNIXTIME >= "1356703029" )); then STROM_DELTA="962.6"; fi # ESAD006
# if (( $STROM_UNIXTIME >= "1356781484" )); then STROM_DELTA="962.6"; fi # ESAD007
# if (( $STROM_UNIXTIME >= "1356874727" )); then STROM_DELTA="962.6"; fi # ESAD008
# if (( $STROM_UNIXTIME >= "1357104775" )); then STROM_DELTA="962.6"; fi # ESAD009
# if (( $STROM_UNIXTIME >= "1357154817" )); then STROM_DELTA="962.6"; fi # ESAD011
# if (( $STROM_UNIXTIME >= "1357154949" )); then STROM_DELTA="962.6"; fi # ESAD012
# if (( $STROM_UNIXTIME >= "1357188893" )); then STROM_DELTA="962.6"; fi # ESAD013
STROM_GESAMT_LEISTUNG=`gawk "BEGIN {OFMT=\"%.3f\"; print ($STROM_GESAMT_LEISTUNG + $STROM_DELTA) ;}"`
echo "\$1;1;$STROM_ZEIT_AKTUELL;$STROM_LEISTUNG;$STROM_GESAMT_LEISTUNG;;;0 # $DATEI" >> $GAS_STROM_OUT
# | | | | | |||
# | | | | | |||
# | | | | | |||
# | | | | | ||+-- 8
# | | | | | |+--- 7
# | | | | | +---- 6
# | | | | +-------------------------- 5
# | | | +------------------------------------------ 4
# | | +-------------------------------------------------------------- 3
# | +----------------------------------------------------------------- 2
# +------------------------------------------------------------------- 1
# 1 Kanal
# 2 Status-Bezeichnung (Index)
# 3 Zeitstempel in Sekunden (UnixTime)
# 4 durchschnittliche Momentanleistung im letzten Intervall
# 5 kummulierte Gesamtleistung
# 6 Gesamtleistung am Stromzähler als Referenz
# 7 Tagesverbrauch
# 8 Checksumme (keine)
STROM_ZEIT_VORHER=$STROM_ZEIT_AKTUELL
fi
# Auswerten der Werte für Gas
if [[ `echo $line|grep Gas` ]] ; then
GAS_GESAMT_IMPULSE=`echo $line|cut -d\; -f14`
GAS_IMPULSE=`echo $line|cut -d\; -f15`
GAS_ZEITSTEMPEL=`echo $line|awk -F";" '{printf "%s %s",$2,$3}'`
GAS_UNIXTIME=`date -d "${GAS_ZEITSTEMPEL:6:4}/${GAS_ZEITSTEMPEL:3:2}/${GAS_ZEITSTEMPEL:0:2} ${GAS_ZEITSTEMPEL:11:8}" "+%s"`
GAS_ZEIT_AKTUELL=$GAS_UNIXTIME
GAS_CBM_PRO_STUNDE=`gawk "BEGIN {OFMT=\"%.3f\"; print ($GAS_IMPULSE*(1/1000))/($GAS_ZEIT_AKTUELL - $GAS_ZEIT_VORHER)*3600 ;}"`
GAS_CBM_GESAMT=`gawk "BEGIN {OFMT=\"%.3f\"; print ($GAS_GESAMT_IMPULSE*(1/1000)) ;}"`
#korrektur der erfassten Werte um Offset (reeller Zählerstand)
GAS_DELTA=0
# 1349867100 Mi 10. Okt 13:05:00 CEST 2012
# 1350244020 43.566 # Referenz So 14. Okt 21:47:00 CEST 2012
# 1352558100 133.809 # Referenz
# 1353311580 171.674 # Referenz
# 1353529020 179.773 # Referenz
# 1353827820 193.537 # Referenz
# 1354329120 218.119 # Referenz
# 1354661280 238.723 # Referenz
# 1354709400 242.498 # Referenz
# 1354801200 248.746 # Referenz
# 1355064180 264.811 # Referenz
# 1355114760 267.119 # Referenz
# 1355170920 270.431 # Referenz
# 1355205660 272.234 # Referenz
# 1355262060 276.139 # Referenz
# 1355288400 277.943 # Referenz
# 1355462340 291.011 # Referenz
# 1355640600 300.949 # Referenz
# 1355858880 311.409 # Referenz
# 1356069360 322.278 # Referenz
# 1356129432 # erster Satz Gasaufzeichnung "Fr 21. Dez 23:37:12 CET 2012"
# 1356214920 322.278 # Referenz Sa 22. Dez 23:22:00 CET 2012
# 1356782340 343.54 # Referenz Sa 29. Dez 12:59:00 CET 2012
# 1356900960 349.258 # Referenz So 30. Dez 21:56:00 CET 2012
# 1356933180 349.81 # Referenz Mo 31. Dez 06:53:00 CET 2012
# 1356947460 350.751 # Referenz Mo 31. Dez 10:51:00 CET 2012
# 1357159980 359.763 # Referenz Mi 2. Jan 21:53:00 CET 2013
if (( $GAS_UNIXTIME >= "1356129432" )); then GAS_DELTA="326.069"; fi # ESAD001 # 315.448 # 325.409
# if (( $GAS_UNIXTIME >= "1356170266" )); then GAS_DELTA="326.069"; fi # ESAD002 # 315.448 # 325.409
# if (( $GAS_UNIXTIME >= "1356195847" )); then GAS_DELTA="326.069"; fi # ESAD003 # 315.448 # 325.409
# if (( $GAS_UNIXTIME >= "1356196466" )); then GAS_DELTA="326.069"; fi # ESAD004 # 315.448 # edit 14:21 325.409
if (( $GAS_UNIXTIME >= "1356214153" )); then GAS_DELTA="325.409"; fi # ESAD004 # ab 23.12.2012 00:09:13 (-01:00)
# if (( $GAS_UNIXTIME >= "1356248433" )); then GAS_DELTA="325.409"; fi # ESAD005 # 315.448
if (( $GAS_UNIXTIME >= "1356252860" )); then GAS_DELTA="332.500"; fi # ESAD005 ab Zeile 60 325.448
# if (( $GAS_UNIXTIME >= "1356703029" )); then GAS_DELTA="332.500"; fi # ESAD006 325.448
# if (( $GAS_UNIXTIME >= "1356781405" )); then GAS_DELTA="332.500"; fi # ESAD007
## if (( $GAS_UNIXTIME >= "1356781537" )); then GAS_DELTA="332.500"; fi # ESAD007 ab 29.12.2012 12:45:37 CET 2012
# if (( $GAS_UNIXTIME >= "1356874727" )); then GAS_DELTA="332.500"; fi # ESAD008
# if (( $GAS_UNIXTIME >= "1357104775" )); then GAS_DELTA="332.500"; fi # ESAD009
# if (( $GAS_UNIXTIME >= "1357154817" )); then GAS_DELTA="332.500"; fi # ESAD011
# if (( $GAS_UNIXTIME >= "1357154949" )); then GAS_DELTA="332.500"; fi # ESAD012
# if (( $GAS_UNIXTIME >= "1357188893" )); then GAS_DELTA="332.500"; fi # ESAD013
GAS_CBM_GESAMT=`gawk "BEGIN {OFMT=\"%.3f\"; print ($GAS_CBM_GESAMT + $GAS_DELTA) ;}"`
echo "\$2;2;$GAS_ZEIT_AKTUELL;$GAS_CBM_PRO_STUNDE;$GAS_CBM_GESAMT;;;0 # $DATEI" >> $GAS_STROM_OUT
# | | | | | |||
# | | | | | |||
# | | | | | |||
# | | | | | ||+------- 8
# | | | | | |+-------- 7
# | | | | | +--------- 6
# | | | | +------------------------ 5
# | | | +-------------------------------------------- 4
# | | +-------------------------------------------------------------- 3
# | +----------------------------------------------------------------- 2
# +------------------------------------------------------------------- 1
# 1 Kanal
# 2 Status-Bezeichnung (Index)
# 3 Zeitstempel in Sekunden (UnixTime)
# 4 durchschnittliche Momentanleistung im letzten Intervall
# 5 kummulierte Gesamtleistung
# 6 Gesamtleistung am Stromzähler als Referenz
# 7 Tagesverbrauch
# 8 Checksumme (keine)
GAS_ZEIT_VORHER=$GAS_ZEIT_AKTUELL
fi
#debug
# echo "DATUM_ALT vor done ganz unten = $DATUM_ALT"
done
#debug
# echo "DATUM_ALT nach done ganz unten = $DATUM_ALT"
echo "# Ende von $DATEI" >> $GAS_STROM_OUT
done
#erste Daten starten am "Mi 10. Okt 13:05:00 CEST 2012" (37kWh am Zähler)
cat /home/gregor/Dokumente/logs/Strom+Gas/Referenz.csv >> $GAS_STROM_OUT
sort -k 3,3 -n $GAS_STROM_OUT > $GAS_STROM_OUT.sortiert
echo "# Startdatum der Werte 10.10.2012 13:05:00" >> $GAS_STROM_OUT.sortiert
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13211
|
gregor-kiel schrieb: @robert: Dein kurzes Skript übersteigt leider meine Kenntnisse, ich kann kaum eine Zeile interpretieren.
Hab gerade keine Zeit. Ich füge nachher Kommentare ein. Ciao robert
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13211
|
rklm schrieb: Hab gerade keine Zeit. Ich füge nachher Kommentare ein.
Done.
|
gregor-kiel
(Themenstarter)
Anmeldungsdatum: 21. Juli 2006
Beiträge: 54
Wohnort: Kiel, GER
|
Vielen Dank rklm! Es funktioniert, es wird keine "17" aus der initialisierung mehr ausgegeben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | DATUM=17 # debug alt:0
# ------ create a named pipe ------
fifo="${TMP:-/tmp}/${0##*/}-$$" # /tmp/basename-PID
mkfifo "$fifo" || exit
trap 'rm "$fifo"' 0 # ensure the named pipe is removed on process exit
# ------ create a named pipe ------
i=0
for DATEI in $DATEIEN;
do # Schleife fuer jede Datei
echo "Datei $DATEI"
cat $DATEI | while read line;
do # Schleife fuer alle Zeilen je Datei
DATUM=`date +%Y%m%d`
echo "DATUM (1) = $DATUM" # Ergibt ein Datum
# ---- write to named pipe ----
echo $DATUM > "$fifo" &
# ---- write to named pipe ----
done
# ---- read from named pipe ----
while read line; do # now read from the pipe until EOF
DATUM=$line
done < "$fifo" # important: open the pipe just once!
wait
# ---- read from named pipe ----
echo "DATUM (2) = $DATUM" # Ergab ohne NamedPipe die 17 aus der Initialisierung
done
exit 0
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13211
|
gregor-kiel schrieb: Vielen Dank rklm!
Bitteschön!
Es funktioniert, es wird keine "17" aus der initialisierung mehr ausgegeben.
Gut! Es gibt aber noch ein paar Probleme mit dem Skript: In Zeile 19 öffnest Du die Named Pipe für jede einzelne Zeile. Das führt dazu, dass Du nur die erste Zeile jeder Datei liest, weil die Pipe EOF sendet, wenn ein schreibender Prozess seinen Filedeskriptor schließt. Du musst das echo nicht in den Hintergrund verschieben. Das ist ineffizient. Besser verschiebst Du die ganze Schleife in den Hintergrund, die die Datei liest. Insbesondere wartet das wait nur auf einen Hintergrungprozess, aber Du erzeugst so viele, wie Zeilen in der Datei sind. Das cat ist immer noch überflüssig. ☺ Ich würde für Variablen innerhalb des Skriptes immer Kleinbuchstaben nehmen, damit man sie leichter von Variablen aus der Umgebung unterscheiden kann.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | datum=17 # debug alt:0
# ------ create a named pipe ------
fifo="${TMP:-/tmp}/${0##*/}-$$" # /tmp/basename-PID
mkfifo "$fifo" || exit
trap 'rm "$fifo"' 0 # ensure the named pipe is removed on process exit
# ------ create a named pipe ------
for datei
do # Schleife fuer jede Datei
echo "Datei $datei"
while read line;
do # Schleife fuer alle Zeilen je Datei
datum=`date +%Y%m%d`
echo "DATUM (1) = $datum" # Ergibt ein Datum
# ---- write to named pipe ----
echo "Line : $line : $datum" >&3
# ---- write to named pipe ----
done < "$datei" 3> "$fifo" &
# ---- read from named pipe ----
while read line; do # now read from the pipe until EOF
datum=$line
echo "read # $line"
done < "$fifo" # important: open the pipe just once!
wait
# ---- read from named pipe ----
echo "DATUM (2) = $datum" # Ergab ohne NamedPipe die 17 aus der Initialisierung
done
|
Ciao robert
|