Ekkehardt
Anmeldungsdatum: 29. Juni 2012
Beiträge: 74
Wohnort: Freiberg / Sa
|
Hallo Leute, ich habe einige ASCII-Dateien mit Messwerten. Diese wurden nach immer gleichen Zeitintervallen ermittelt. Ich möchte die meist über 30000 Zeilen reduzieren, indem ich nur den ersten und jeden 100. Wert behalte, ergo die Messintervalle nachträglich verlängere. Meine Dateien beginnen so: "Probenkennung";"Fe-Ni_20_3"
"Bezeichnung der Unterserie";""
"Durchmesser";5,96;"mm"
"Parallele Probenlänge";35,9;"mm"
"Standardkraft";"Dehnung";"Standardweg"
"MPa";"%";"mm"
5,04551;0;0
5,07701;-0,000729691;-0,000182423
5,10851;-0,000364846;-9,12114e-005
5,01402;-0,000364846;-9,12114e-005
5,10851;0;0
5,01402;-0,000729691;-0,000182423 Die ersten sechs Zeilen sind immer vorhanden und sollen ebenfalls behalten werden. Die Ausgabe soll in eine gesonderte Datei stattfinden. Wie liese sich soetwas auf der Shell umsetzen? Eine vollständige Datei findet sich hier: http://paste.ubuntu.com/9527089/
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
| #!/bin/bash
# schreibe die ersten 6 Zeilen der Datei data.txt in output.txt
head -n 6 data.txt > output.txt
# schreibe beginnend bei der Zeile 7 jede hundertste Zeile in die Datei, bis das Ende erreicht ist.
for i in $(seq 7 100 $(wc -l data.txt | cut -d " " -f 1)); do
sed ""$i"q;d" data.txt >> output.txt
done
|
|
Ekkehardt
(Themenstarter)
Anmeldungsdatum: 29. Juni 2012
Beiträge: 74
Wohnort: Freiberg / Sa
|
Das funktioniert ausgezeichnet, herzlichen Dank für die schnelle Hilfe ☺
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Das ganze könntest Du mit sed sehr viel einfacher haben: sed -n '1,6p; 7~20p' messwerte.txt > auswahl.txt Die Zeilenadressierung ist hier erklärt.
Aber was willst Du mit den Daten eigentlich machen ? Denn die Zahlen sehen mir sehr danach aus, als wenn da doch einiges an Rauschen drauf wäre ... Das könntest Du durch (ggf. sogar gleitende) Mittelwertbildung loswerden. Sowas mit Shell-Mitteln zu machen, ist allerdings ziemliche Viecherei, so dass ich awk o.ä. empfehlen würde: awk -F";" 'NR<7{print; next} {gsub(",","."); x1+=$1; x2+=$2; x3+=$3} NR%10==6 {OFR=FR; print x1/10,x2/10,x3/10; x1=0; x2=0; x3=0}' messwerte.txt Kurz erklärt, und als Skript geschrieben: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #!/usr/bin/awk -f
BEGIN { FR=";" } # Worttrenner einstellen
NR < 7 { print; # die ersten 6 Zeilen nur direkt drucken
next }
{ gsub(",","."); # danach: Dezimalkommata ersetzen
x1+=$1; # und aufaddieren
x2+=$2;
x3+=$3 }
NR%10==6 { OFR=FR; # bei Zeile 6 Modulo 10: (Ausgangs-Worttrenner übernehmen)
print x1/10,x2/10,x3/10; # Mittelwerte drucken
x1=0; # und Summen löschen
x2=0;
x3=0 }
|
LG, track
|
Ekkehardt
(Themenstarter)
Anmeldungsdatum: 29. Juni 2012
Beiträge: 74
Wohnort: Freiberg / Sa
|
Ich finde die erste Lösung hübscher und habe meine Daten bereits damit wie gewünscht reduziert.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
track schrieb: Das ganze könntest Du mit sed sehr viel einfacher haben: sed -n '1,6p; 7~20p' messwerte.txt > auswahl.txt Die Zeilenadressierung ist hier erklärt.
Gut zu wissen, so genau kannte ich die Möglichkeiten in sed Zeilen auszuwählen noch nicht 👍
|
rdsieb
Anmeldungsdatum: 17. Dezember 2014
Beiträge: Zähle...
|
Solange deine Messreihen ungeordnet sind und 'zufällig' ausgestrichen werden kann dann sind die Skript gut.
Gerade wenn so viele Messdaten vorhanden sind, würde ich nur 'Gleiche' Messdaten kürzen bzw. mitteln. Gibt es zwischen "Standardkraft";"Dehnung" einen funktionalen Zusammenhang? Dann gebe es vielleicht die Möglichkeit ein Funktion anzupassen und nur diese weiterzugeben?
|
Ekkehardt
(Themenstarter)
Anmeldungsdatum: 29. Juni 2012
Beiträge: 74
Wohnort: Freiberg / Sa
|
Es handelt sich um Spannungs-Dehnungs-Kurven, die linear beginnen (Hooke'sche Geraden). Auf diesen linearen Teil kommt es nicht an, ich berechne aus dem plastischen Teil Fließ- und Verfestigungskurven. Im plastischen Teil kann alles mögliche passieren, abhängig vom Werkstoff. Der Verlauf kann logarithmisch sein oder auch Wendepunkte enthalten. Die Messzeit durch streichen von Zwischenwerten nachträglich zu verlängern ist ein gängiges Verfahren, um Rechenzeit und Aufwand einzusparen. Darüber hinaus lässt sich eine Verfestigungskurve (erste Ableitung der Fließkurve) auf Grund des Rauschens nicht mehr sinnvoll ermitteln, wenn ich alle 30000 Messwerte einbeziehe.
|
rdsieb
Anmeldungsdatum: 17. Dezember 2014
Beiträge: 10
|
"Darüber hinaus lässt sich eine Verfestigungskurve (erste Ableitung der Fließkurve) auf Grund des Rauschens nicht mehr sinnvoll ermitteln, wenn ich alle 30000 Messwerte einbeziehe." Dann sollte man aber das Rauschen über eine Funktion glätten und nicht einfach nur Messwert entfernen .-) weil ne Funktion lässt sich dann einfacher differenzieren.
- Bilder
|
Ekkehardt
(Themenstarter)
Anmeldungsdatum: 29. Juni 2012
Beiträge: 74
Wohnort: Freiberg / Sa
|
Ich bin beide Wege schon gegangen. Ich bin über die Messwerte schneller. Mehr Messwerte =/= besser. Mir wäre am liebsten, ich könnte ein längeres Messintervall vorgeben. Das war aber in diesem Fall nicht möglich.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
... hatte ich oben nicht Mittelwertbildung vorgeschlagen ? 😉 Schließlich bin ich selber Ingenieur, und da ahnte ich schon fast sowas. 🐸 LG, track
|
Ekkehardt
(Themenstarter)
Anmeldungsdatum: 29. Juni 2012
Beiträge: 74
Wohnort: Freiberg / Sa
|
Gleitende Mittelwertbildung würde ich nicht unbedingt auf der Shell machen. Das geht mit Qtiplot sehr schön. Und flexibel. Es werden trotz allem von vornherein viel mehr Messwerte ermittelt, als nötig sind.
|
rdsieb
Anmeldungsdatum: 17. Dezember 2014
Beiträge: 10
|
"Gleitende Mittelwertbildung würde ich nicht unbedingt auf der Shell machen" nun ja wenn entsprechend kaufbare Programme nicht zu Verfügung hat, geht das schon. Es gibt ja auch andere Filter die nutzbar wären, je nachdem wie das Rauschen aussieht. Wenn du den passenden Workflow für die Daten gefunden hast und die Ergebnisse für sich sprechen, dann passt es ja. Sonst einfach den Funktion mit Parameter bilden, per Solver anpassen lassen...dann ist das Rauschen auch raus.
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6345
Wohnort: Hamburg
|
Es werden trotz allem von vornherein viel mehr Messwerte ermittelt, als nötig sind.
Normalerweise kann man gar nicht zu viele Messwerte haben 😉 Also von extremen Verhältnissen mal abgesehen (wenn man z,B. Temperaturen von Räumen im Millisekunden Bereich ermittelt). Ich bin daher auch ein Fan von Gleitenden Mittelwerten, oder genauer einfacher gleitender Mittelwerten (SMA). Da geht dann wenigstens keine Information total verloren und Ausreißer richten wenig Schaden an. Allerdings würde ich sowas auch nicht als Shell Script verwirklichen, Als C Programmierer habe ich da andere Möglichkeiten. Bisher habe ich damit aber nur Audio Dateien untersucht. Wie auch immer, Messdaten einfach wegwerfen ist normalerweise nicht die optimale Vorgehensweise. Aber das kan man nur endgültig beurteilen, wenn der Anwendungszweck bekannt ist.
|
Ekkehardt
(Themenstarter)
Anmeldungsdatum: 29. Juni 2012
Beiträge: 74
Wohnort: Freiberg / Sa
|
Ich komme mit gleitenden Mittelwerten, Savitzky-Golay, FFT, lokaler Regression und dem Wegwerfen von Zwischenwerten schlussendlich auf den gleichen Verfestigungsexponenten. Da mehr Messwerte mehr Arbeit machen, kann ich schon zu viele Werte haben, wenn ich dadurch kein besseres Ergebnis erhalte. Ich habe hier auch kein Audiosignal vorliegen, sondern eine Spannungs-Dehnungs-Kurve. Diese wird selbst mit 100 Werten noch hinreichend genau beschrieben. Ich habe nach dem Streichen immernoch >300.
|