Daten auswerten mit awk, sed, grep ??

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Daten auswerten mit awk, sed, grep ??

Beitrag von jcw » 06.10.2023 15:17:46

Hallo!
Ich schreibe mir gerade ein bash-Skript. Nun hänge ich an einer Stelle fest, an der ich nicht weiterkomme. Zum Hintergrund: Mittels einer CFD-Software lasse ich mir Daten als csv-Datei rausschreiben. Der Datensatz enthält 4 Spalten:. Temperatur,x,y,z(-Koordinaten). Siehe Beispiel (Ausschnitt):

Code: Alles auswählen

341.874084472656,-0.000705280239069481,0.00579587658531983,-0.0460738495315031
341.679748535156,-0.000645140022304951,0.005678238487966,-0.0461317699614403
341.996032714844,-0.000699345444964885,0.00602578799982332,-0.0460740129139252
341.421691894531,0.00438122227431762,0.00344348519692563,-0.0463320988362479
341.532409667969,0.00439771370713714,0.00351409674970048,-0.0462175099587241
341.731872558594,0.00451049831295967,0.00354900037255546,-0.0461076071320178
https://nopaste.debianforum.de/41978

Bei den Daten handelt es sich um einen periodischen, axialsymmetrischen Körper (Segment eines Laufrades). Die Temperatur an den periodischen Rändern sind identisch. So soll es auch sein. Jetzt kommt die Aufgabe: Die Daten eines(!) periodischen Randes sollen gelöscht werden. Also die ganze Zeile in dem oben genannten Datensatzes. Meine Idee ist folgende:
  • Umwandlung der kartesichen Koordinaten in zylindrische Koordinaten.
    Ein erstes Indiz für einen periodischen Rand ist, falls z-Koordinate und r mehrmals in der Tabelle vorkommt (wäre dann ein potenzielles Knotenpaar).
    Ein weiteres Indiz für einen periodischen Rand ist, falls theta oder ein Vielfaches mehrmals bei einem potenziellen Knotenpaar vorkommt.
Nach mehreren Operationen kommt das heraus. Beispiel:

Code: Alles auswählen

-Nr.-,----Temp-------,-----x_ori-----,----y_ori-----,------z_ori---,-----T_mod------,-----x_mod----,-------y_mod--,------z_mod----,---r---,-theta1,-theta2,-theta3---
5490,340.785949707031,0.004337127055,0.009018628340,-0.046000000000,340.785949707031,0.004337127055,0.009018628340,-0.046000000000,0.01001,1.12254,2.16974,0.07534
5491,340.789520263672,0.005633509193,0.008274496822,-0.046000000000,340.789520263672,0.005633509193,0.008274496822,-0.046000000000,0.01001,0.97305,2.02025,-0.07414
5964,320.922790527344,-0.000103829607,0.001153735943,-0.066265319863,320.922790527344,-0.000103829607,0.001153735943,-0.066265319863,0.00116,-1.48104,-0.43385,-2.52824
6453,320.922790527344,0.000947249833,0.000666787049,-0.066265319863,320.922790527344,0.000947249833,0.000666787049,-0.066265319863,0.00116,0.61335,1.66055,-0.43385
5983,320.677429199219,-0.000026196403,0.000295805955,-0.066925206677,320.677429199219,-0.000026196403,0.000295805955,-0.066925206677,0.00030,-1.48247,-0.43527,-2.52966
7144,339.476226806641,0.002667510101,0.010427353983,-0.046000000000,339.476226806641,0.002667510101,0.010427353983,-0.046000000000,0.01076,1.32035,2.36755,0.27315
7145,339.494903564453,0.004072134892,0.009962116499,-0.046000000000,339.494903564453,0.004072134892,0.009962116499,-0.046000000000,0.01076,1.18276,2.22996,0.13556
5895,322.598968505859,-0.000450195097,0.004791635801,-0.064373743326,322.598968505859,-0.000450195097,0.004791635801,-0.064373743326,0.00481,-1.47712,-0.42992,-2.52431
6384,322.598968505859,0.003924580780,0.002785698291,-0.064373743326,322.598968505859,0.003924580780,0.002785698291,-0.064373743326,0.00481,0.61728,1.66447,-0.42992
6472,320.677429199219,0.000243077270,0.000170589728,-0.066925206677,320.677429199219,0.000243077270,0.000170589728,-0.066925206677,0.00030,0.61193,1.65912,-0.43527
6638,330.813873291016,0.001766323598,0.006242004735,-0.058831045099,330.813873291016,0.001766323598,0.006242004735,-0.058831045099,0.00649,1.29503,2.34223,0.24783
6639,330.813018798828,0.002061329497,0.006150889600,-0.058831045099,330.813018798828,0.002061329497,0.006150889600,-0.058831045099,0.00649,1.24743,2.29463,0.20023
https://nopaste.debianforum.de/41979

Erläuterung: Die erste Spalte ist die Nummerierung der einzelnen Zeilen. Die ist identisch mit dem Originalfile aus der rausgeschriebenen Tablle (T,x,y,z). Alle Werte mit _ori sind eine Übernahme der Werte aus der Originaltabelle. Also, ohne jegliche Veränderung. Alle Werte mit _mod sind modifizierte Werte aus _ori. Zum Beispiel ein Offset bei der Temperatur (Celsius/Kelvin). Bei x_mod, y_mod, z_mod eine Translation des Koordinatensystems für die weitere Umrechnung ins zylindrische Koordinatensysten. Weiter wird zum Beispiel .8e3 in .8*10^3 umgewandelt, um mit bc arbeiten zu können. r und theta1 sind die Koordinaten nach der Transformation ins zylindrische Koordinatensystems. theta2 und theta3 sind Hilfsvariablen.

Aufgabe zur Identifizierung periodischer Punkte sind:
Knoten 5964 und 6453, weil r und z-Koordinaten identisch sind UND theta2 des Knotens #5964 identisch mit theta3 des Knotens #6453 (theta2,5964=theta3,6453).
Knoten 5895 und 6384, weil r und z-Koordinaten identisch sind UND theta2 des Knotens #5895 identisch mit theta3 des Knotens #6384 (theta2,5895=theta3,6384)

Nicht periodisch:
Knoten 6638 und 6639, weil r und z-Koordinaten zwar sind identisch , aber es keine gleichen Werte der beiden Knoten bei theta1, theta2 oder theta3 gibt!

In dem o.g. Beispiel ist es jetzt Zufall, dass bei periodischen Punkten theta2,#1=theta3,#1+1 ist. Gültig ist eine beliebige Kombination. Also, dass es mindestens einen Wert von theta1,theta2,theta3 gibt, der bei dem anderen Punkt auch vorkommt.
Nur auf die Temperaturwerte zu schauen ist nicht(!) ausreichend.

Ziel: Kann ich mittels awk diese Abfrage zum periodischen Punkt programmieren? Also, über die Zeilen 'springen' und Abfragen machen? Als Ergebnis sollte bei periodisch vorkommenden Knoten die Knotennummer eines der beiden Knotennummern ausgeben und in eine Datei geschrieben werden. Idealerweise immer die Knotennummer des Knotenpaares mit dem kleinsten/größten theta1.

Danke für die Hinweise und Lösungsvorschläge.

chrbr
Beiträge: 551
Registriert: 29.10.2022 15:53:26

Re: Daten auswerten mit awk, sed, grep ??

Beitrag von chrbr » 06.10.2023 16:29:07

Nach meinem Verständnis suchst du für jede Zeile, ob es in den nachfolgenden Zeilen Kandidaten gibt, die zu deinen Kriterien passen. AWK arbeitet zeilenweise. Du könntest also

Code: Alles auswählen

1. Die erste Zeile nehmen.
2. In allen folgenden Zeilen nach einem Treffer hinsichtlich der Kriterien suchen.
3. Das Ergebnis ausgeben.
4. Die erste Zeile wegwerfen.
5. Die zweite Zeile ist nun die neue erste Zeile.
6. GOTO 1 bis alle Zeilen abgearbeitet sind.
Nach der Methode würde man für jede Zeile ein AWK Skript durchlaufen lassen müssen.

Einfacher tut man sich wahrscheinlich mit Python/numpy, Perl, Octave und so weiter, mit denen man alle Zeilen einliest und darüber iteriert. Aber du scheinst den Teil mit den Zylinderkoordinaten ja schon implementiert zu haben. Da ist es natürlich reizvoll, den Rest auch ohne eine "grosse" Skriptsprache zu implementieren.

Noch eine Erbsenzählerei:
jcw hat geschrieben: ↑ zum Beitrag ↑
06.10.2023 15:17:46
falls theta oder ein Vielfaches mehrmals bei einem potenziellen Knotenpaar vorkommt.
Hier meinst du wahrscheinlich theta modulo 360°.

jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Re: Daten auswerten mit awk, sed, grep ??

Beitrag von jcw » 09.10.2023 12:25:27

Schon mal vielen Dank für die Rückmeldung.
Schade, ich habe gedacht, es würde einfacher gehen. Eigentlich stehen ja die potenziellen Kandidaten untereinander in der Liste. Ich habe gedacht, ich könnte mit awk die vorangegangene Zeile speichern und dann mit der aktuellen auswerten. Falls die Kriterien zu den periodischen Knoten erfüllt sind, wird die Knotennummer rausgeschrieben/oder Zeile gelöscht. Ansonsten die nächsten Zeilen abfragen. Ich weiß aber auch nicht, wie man eine vorangegangene Zeile speichern und auswerten könnte.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Daten auswerten mit awk, sed, grep ??

Beitrag von Meillo » 09.10.2023 12:45:04

jcw hat geschrieben: ↑ zum Beitrag ↑
09.10.2023 12:25:27
Eigentlich stehen ja die potenziellen Kandidaten untereinander in der Liste. Ich habe gedacht, ich könnte mit awk die vorangegangene Zeile speichern und dann mit der aktuellen auswerten. Falls die Kriterien zu den periodischen Knoten erfüllt sind, wird die Knotennummer rausgeschrieben/oder Zeile gelöscht. Ansonsten die nächsten Zeilen abfragen. Ich weiß aber auch nicht, wie man eine vorangegangene Zeile speichern und auswerten könnte.
Das geht:

Code: Alles auswählen

awk '
{
	if (last == $0) {
		# Zeilen sind identisch
	}
	last=$0
}
'
Du willst aber ja nicht die gesamten Zeilen vergleichen, sondern einzelne Werte. Dazu kannst du `last' mit split() in ein Array aufsplitten oder dir gleich nur die relevanten Werte der vorigen Zeile merken.

Schau dir die Manpage von awk an, dort findest du alle Funktionen. Sonst nochmal fragen.
Use ed once in a while!

chrbr
Beiträge: 551
Registriert: 29.10.2022 15:53:26

Re: Daten auswerten mit awk, sed, grep ??

Beitrag von chrbr » 09.10.2023 14:53:45

Da hat Meillo einen guten Punkt aufgebracht.

In awk Skripts gibt es drei Blöcke, die man nicht zwingend alle brauch.
  • In einem BEGIN Block kann man Dinge initialisieren.
  • Im mittleren Block werden Zeilen verarbeitet.
  • In einem END Block kann man final Daten aufbereiten.
Unter Umständen ist es ein praktikabler Weg, im mittleren Block Daten in ein Array zu lesen und mit Schleifen im END Block darüber zu iterieren.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Daten auswerten mit awk, sed, grep ??

Beitrag von Meillo » 09.10.2023 15:10:30

chrbr hat geschrieben: ↑ zum Beitrag ↑
09.10.2023 14:53:45
Unter Umständen ist es ein praktikabler Weg, im mittleren Block Daten in ein Array zu lesen und mit Schleifen im END Block darüber zu iterieren.
Das ist nur noetig, wenn man Zugriff auf alle Zeilen braucht. Ich habe es so verstanden, dass jeweils nur Zugriff auf die vorige Zeile noetig ist. Das geht ganz einfach indem man sich diese in einer Variable merkt (siehe mein Beispiel). Alle Zeilen zu speichern sollte man nur als Notloesung nehmen, weil das erstens viel komplexer umzusetzen ist und zweitens vom Speicherverbrauch bei grossen Dateien nicht skaliert. Wenn es also vermeidbar ist, sollte man es vermeiden. ;-)
Use ed once in a while!

jcw
Beiträge: 99
Registriert: 10.01.2016 17:11:46

Re: Daten auswerten mit awk, sed, grep ??

Beitrag von jcw » 09.10.2023 16:05:10

Da muss ich mich mal dransetzten und schauen, wie ich das umsetzen (kann). Bin da noch nicht so geübt.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Daten auswerten mit awk, sed, grep ??

Beitrag von Meillo » 09.10.2023 16:12:09

jcw hat geschrieben: ↑ zum Beitrag ↑
09.10.2023 16:05:10
Da muss ich mich mal dransetzten und schauen, wie ich das umsetzen (kann). Bin da noch nicht so geübt.
Wir helfen dir gerne weiter, wenn du irgendwo haengst.
Use ed once in a while!

Antworten