ubuntuusers.de

Variable wird vergessen in while do Schleife

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

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 Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

gregor-kiel schrieb:

Mach mal besser

1
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

Avatar von 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 Team-Icon

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 Team-Icon

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

Avatar von 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 Team-Icon

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 Team-Icon

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 Team-Icon

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 Team-Icon

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

Antworten |