Archiv verlassen und diese Seite im Standarddesign anzeigen : verzweifle beim awk-bastling!
Hi Leute!
Bastele schon seit einer Weile an einem script, welches mir über einige Spalten den Mittelwert bildet.
Beispiel Filename: 20060706M2FZ
06.07.2006 00:10:00 +0.559E+03 +0.128E+00 +0.166E+0
06.07.2006 00:20:00 +0.597E+03 +0.128E+00 +0.414E+0
06.07.2006 00:30:00 +0.598E+03 +0.128E+00 +0.564E+0 !!!W!!!
06.07.2006 00:40:00 +0.598E+03 +0.128E+00 +0.772E+0
....
awk '{ mwa += $3 ; mwb += $4 ; mwc += $5 ; nl++; } END { print (mwa / nl), (mwb / nl), (mwc / nl)}' 20060706M2FZ
Dies funktioniert mit der o.a. awk-Anweisung prächtig. Ich möchte aber die Zeilen/Werte an deren Ende ein !!!W!!! steht von der Mittelwertbildung ausschließen.
Also, nur wenn $NF nicht !!!W!!! enthält, dürfen die Einzelwerte an der Summenbildung teilnehmen. Ich habe versucht, dies mit einer IF-Anweisung in die awk-Befehlskette zu montieren, aber all meine Versuche blieben ohne Erfolg! :mauer: Es wäre riesig, wenn Ihr mir da weiter helfen könntet.
Vorab besten Dank und verregnete Grüße aus Alsdorf
Ralf :cool:
Hi Leute!
Bastele schon seit einer Weile an einem script, welches mir über einige Spalten den Mittelwert bildet.
Beispiel Filename: 20060706M2FZ
06.07.2006 00:10:00 +0.559E+03 +0.128E+00 +0.166E+0
06.07.2006 00:20:00 +0.597E+03 +0.128E+00 +0.414E+0
06.07.2006 00:30:00 +0.598E+03 +0.128E+00 +0.564E+0 !!!W!!!
06.07.2006 00:40:00 +0.598E+03 +0.128E+00 +0.772E+0
....
awk '{ mwa += $3 ; mwb += $4 ; mwc += $5 ; nl++; } END { print (mwa / nl), (mwb / nl), (mwc / nl)}' 20060706M2FZ
Dies funktioniert mit der o.a. awk-Anweisung prächtig. Ich möchte aber die Zeilen/Werte an deren Ende ein !!!W!!! steht von der Mittelwertbildung ausschließen.
Also, nur wenn $NF nicht !!!W!!! enthält, dürfen die Einzelwerte an der Summenbildung teilnehmen. Ich habe versucht, dies mit einer IF-Anweisung in die awk-Befehlskette zu montieren, aber all meine Versuche blieben ohne Erfolg! :mauer: Es wäre riesig, wenn Ihr mir da weiter helfen könntet.
Vorab besten Dank und verregnete Grüße aus Alsdorf
Ralf :cool:
awk '!/\!\!\!W\!\!\!/ { mwa += $3 ; mwb += $4 ; mwc += $5 ; nl++; } END { print (mwa / nl), (mwb / nl), (mwc / nl)}' 0060706M2FZ
HTH,
smg
Hi smg!
Erst mal vielen Dank für Deine Antwort. Mittlerweile hatte ich schon einen anderen Weg zur Problemlösung gefunden, allerdings bei weitem nicht so elegant.
So im nachfolgenden Ausschnitt. Das Script soll mir die Tagesmittelwerte für den Monat 07.2006, aus allen Files 200607??M1FZ der Messsonde M1 zusammenfassen. Später soll dann noch der Monatsmittelwert gebildet werden. Doch weiterhin möchte ich die gleiche Prozedur auf baugleiche files der Sonden M2, M3, Mn anwenden.
....
echo " ";
echo "datum M1 M2 M3";
echo "________________________________________"
for i in `ls 200607??M1FZ`
do awk '{ if( $NF !~ "!!!Wartung!!!") avodl += $61; if( $NF !~ "!!!Wartung!!!") nl++;}
END { printf("%s\t%6.4e\t%6.4e\t%s\n", $1, avodl/nl, avodl, nl) }' $i 2>&1;
done
...
Mir fehlt der endscheidende Kniff die Prozedur gezielt auf weitere Files (also nicht nur wie im o.a. Beispiel auf 200607??M1FZ, sondern auch auf 200607??M2FZ, 200607??M3FZ, 200607??MnFZ) anzuwenden und dann entsprechend wie im unten gelisteten Muster, mit TABULATOR getrennt auszugeben.
Das Ergebnis soll dann wie folgt aussehen:
datum M1 M2 M3
__________________________________________________
01.07.2006 9.9458e+01 1.0143e+02 1.0284e+02
02.07.2006 1.0080e+02 1.4515e+04 1.0143e+02
03.07.2006 1.0143e+02 1.0284e+02 1.0284e+02
04.07.2006 1.0284e+02 1.4809e+04 1.0284e+02
05.07.2006 1.0395e+02 1.4969e+04 1.0143e+02
...
30.07.2006 9.9946e+01 1.0284e+02 1.0284e+02
31.07.2006 9.8978e+01 1.4253e+04 1.0143e+02
Also, es wäre riesig, wenn Ihr mir hier einen Tipp geben könntet, wie ich die for-Schleife auf die weiteren files anwenden kann!
Vorab besten Dank
Ralf
butterkeks
17.09.2006, 11:16
wenn du einen oder mehrere fileglobs (d.h. Dateinamenmuster mit Wildcards wie *,?, {}, ...) hast, der die gewünschten Dateien erfasst, übergib sie einfach dem for:
for i in *.txt; do print $i; done
Damit gibst du alle Dateien aus, die in .txt enden.
In deinem Beispiel wäre der Fileglob
200607\?\?M?FZ
(die Fragezeichen selber sind Wildcards, die für ein einzelnes Zeichen stehen)
Die Nummer kannst du dann per sed oder so aus dem Namen rausholen
echo " ";
echo "datum M1 M2 M3";
echo "________________________________________"
for i in 200607*M*FZ
do awk '!/\!\!\!W\!\!\!/ { mwa += $3 ; mwb += $4 ; mwc += $5 ; nl++; } END { printf("%s\t%6.4e\t%6.4e\t%s\n", $1, avodl/nl, avodl, nl) }' "$i"
done 2>&1
HTH
echo " ";
echo "datum M1 M2 M3";
echo "________________________________________"
for i in 200607*M*FZ
do awk '!/\!\!\!W\!\!\!/ { mwa += $3 ; mwb += $4 ; mwc += $5 ; nl++; } END { printf("%s\t%6.4e\t%6.4e\t%s\n", $1, avodl/nl, avodl, nl) }' "$i"
done 2>&1
HTH
Hi smg!
Das funktioniert so leider nicht, denn das script gibt mir die Daten für den jeweiligen Tag untereinander anstatt nebeneinander aus.
datum M1 M2 M3
________________________________________
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
01.07.2006 0.0000e+00 0.0000e+00 144
02.07.2006 0.0000e+00 0.0000e+00 144
02.07.2006 0.0000e+00 0.0000e+00 144
02.07.2006 0.0000e+00 0.0000e+00 144
usw...
Gruss
Ralf
Okay, und wie soll es ausgegeben werden? :)
Ich verstehe dich nicht wirklich, die Ausgabe ist doch schön so. :confused:
wenn du einen oder mehrere fileglobs (d.h. Dateinamenmuster mit Wildcards wie *,?, {}, ...) hast, der die gewünschten Dateien erfasst, übergib sie einfach dem for:
for i in *.txt; do print $i; done
Damit gibst du alle Dateien aus, die in .txt enden.
In deinem Beispiel wäre der Fileglob
200607\?\?M?FZ
(die Fragezeichen selber sind Wildcards, die für ein einzelnes Zeichen stehen)
Die Nummer kannst du dann per sed oder so aus dem Namen rausholen
Hi Butterkeks!
Klingt ja recht überschaubar Dein Tipp, doch weiss ich nicht wie ich das für mein script umsetzen soll. Nochmal schnell mein gedöns.
Pro Tag fallen 144 Einzelwerte an, die je Messsonde in einem file gesichert werden 20060701M1FZ
20060701 = Datum
M1 = Messsonde
FZ = weitere Zeichen
Von acht Sonden M1 - M8 werden zeitgleich Messdaten in den Files gesichert.
Diese Werte möchte ich am Ende eines jeden Monats (cron) mit einem script auswerten lassen - Mittelwert. Und da dachte ich, dies mit awk, wie in dem
nachfolgenden "Wünschmirwas-Beispiel" nacheinander berechnet und ausgegeben zu lassen.
echo " ";
echo "datum M1 M2 M3";
echo "________________________________________"
for i in 200607??M1FZ
do awk '!/\!\!\!W\!\!\!/ { avodl1 += $61 ; nl1++; }
for i in 200607??M2FZ
do awk '!/\!\!\!W\!\!\!/ { avodl2 += $61 ; nl2++; }
for i in 200607??M3FZ
do awk '!/\!\!\!W\!\!\!/ { avodl3 += $61 ; nl3++; }
END { printf("%s\t%6.4e\t%6.4e\t%s\n", $1, avodl1/nl1, avodl2/nl2, avodl3/nl3) }' "$i"
done 2>&1
So wie in meinem Beispiel begonnen, nimmt awk mit dem script jeweils den 01. 07.2006 eines jeden Files / Messsonde. Dies mit der Übergabe der Variablen i an den Wert zu übergeben, muss ich zu meiner Schande gestehen, ist mir nicht gelungen. Weiterhin ist die Anzahl der Tage eines jeden Monats und die Anzahl der Sonden=Files nicht gleich! Auch der Übersicht halber wäre mir eine verkettete Lösung, wie im wünschmirwas code-Beispiel lieber.
Vorab besten Dank und einen fast nachbarschaftlichen Gruß nach Düren!
Ralf
Okay, und wie soll es ausgegeben werden? :)
Ich verstehe dich nicht wirklich, die Ausgabe ist doch schön so. :confused:
;) naja, sagen wir mal mäßig schön! Aber im ernst, es ist schon überschaubarer, zumindest für mich, wenn die Mittelwerte der einzelnen Messsonden auf das Datum bezogen "nebeneinander" gelistet werden, so wie in der nachfolgenden Codebox dargestellt.
Datum M1 M2 M3
________________________________________
01.07.2006 9.9458e+01 1.0143e+02 1.0284e+02
02.07.2006 1.0080e+02 1.4515e+04 1.0143e+02
03.07.2006 1.0143e+02 1.0284e+02 1.0284e+02
04.07.2006 1.0284e+02 1.4809e+04 1.0284e+02
05.07.2006 1.0395e+02 1.4969e+04 1.0143e+02
...
30.07.2006 9.9946e+01 1.0284e+02 1.0284e+02
31.07.2006 9.8978e+01 1.4253e+04 1.0143e+02
Vorab besten Dank
Ralf
Hi Leute!
Nach vielen Versuchen, habe ich nun eine Lösung für mein "Problemchen" gefunden.
Ich schreibe die Ergebnisse in einen File und setze dies Ergebnisse später "einfach" mit dem LINUX-Kommando "paste" zusammen. Leider scheitert es momentan daran, dass ich eine Bestimmung des MAX- und des MINImal-Wertes nicht sinnvoll implementiert bekomme. Eine direkte Funktion zur Bestimmung der Minimal und Maximalwerte habe ich in awk nicht gefunden. Dann hab ich versucht das funktionierende Command cat testm2.txt | awk '$1>max{max=$1}' einzubinden, doch leider ohne Erfolg. Vorab besten Dank für jede Idee!
Gruß
Ralf
rm -f testm?.txt;
for i in `ls /public/arbeit/messdaten/MD2006/200606??M1FZ`;
do awk '{ avodl += $NF; nl++; d1 += $9;}
END { printf("%s\t%6.4e\n", $1, avodl/nl) }' $i 2>&1 >> testm1.txt;
done
awk '{ amodl += $2; nm++;}
END { printf("\n%s\t%6.4e\n%s\n ","monAVR_ODL" ,amodl/nm, "MAX ODL ")}
' testm1.txt >> testm1.txt
....
for i in `ls /public/arbeit/messdaten/MD2006/200606??M4FZ`;
do awk '{ avodl4 += $NF; nl4++; d14 += $9;}
END { printf("%6.4e\n", avodl4/nl4) }' $i 2>&1 >> testm4.txt;
done
awk '{ amodl4 += $1; nm4++;}
END { printf("\n%6.4e\n",amodl4/nm4)}
' testm4.txt >> testm4.txt
echo "Datum M1 M2 M3 M4" >> testmm.txt;
echo "__________________________________________________________________________" >> testmm.txt
paste testm1.txt testm2.txt testm3.txt testm4.txt >> testmm.txt;
echo "__________________________________________________________________________" >> testmm.txt
ERGEBNIS!
Datum M1 M2 M3 M4
__________________________________________________________________________
01.06.2006 9.0025e+01 8.3914e+01 8.9257e+01 1.0310e+02
02.06.2006 9.0411e+01 8.3701e+01 8.8718e+01 1.0340e+02
..
29.06.2006 9.7806e+01 8.7372e+01 9.2637e+01 1.1216e+02
30.06.2006 9.9702e+01 8.8624e+01 9.4199e+01 1.1235e+02
AVR_ODL 9.6739e+01 8.7447e+01 9.2534e+01 1.0984e+02
MAX ODL
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.