Tabellen analysieren per BASH möglich ?

H

hubert

Grünschnabel
Hallo Experten !

Ich habe eine Frage, hoffentlich könnt Ihr mir helfen.

Ich habe eine Menge (ca. 1000) Dateien, die alle Meßdaten in (x,y) - Form enthalten (durch einen Tabulator getrennt). Sie sind alle folgendermaßen aufgebaut

1 <tab> 1.5
2 <tab> 3.0
3 <tab> 4.5
... ...
200 <tab> 300

Ich würde nun gerne in jede Zeile die zum jeweiligen x-Wert die Ableitung dazu schreiben (in Näherung als Differenzenquotienten).

Mein Problem ist nun: Ich muß z.B. für die Formel in Zeile 27 auf Daten der Zeile 26 und 28 zugreifen usw. Das habe ich zumindest mit AWK nicht hinbekommen.

Läßt sich das ganze automatisieren (ohne Einlesen in eine Tabellenkalkulation) ? Ich würde gerne am Ende eine Schleife über alle Dateien laufen lassen ...

Vielen Dank für Eure Hilfe.

Hubert
 
Hallo
Dein Problem ist offensichtlich die Startzeile und Endzeile genau zu erkennen.
Wenn du das genau definieren kannst, kannst du das auch lösen.
Mit den spärlichen Infos kann ich dir wenig helfen.
Beispieldaten!
Erwartete Ausgabe!
OS
verwendete Shell

Gruß Wolfgang
 
Details

Hallo !

Danke für Deine Antwort.

Also:
Betriebssystem: Linux (Ubuntu) - deshalb bin ich in diesem Forum gelandet
Shell: BASH (siehe Betreff)

Die Formel, die ich verwenden will:

Ableitung an der Stelle x:

d(x) = 1/2 * (y(x+1) - y(x-1))

Wie gesagt, die Daten liegen tabellarisch in x <tabulator> y - Form vor.

1 18.852
2 40.336
3 75.192
4 163.575
5 274.782
6 491.376
7 810.6
8 1402.109
9 1972.679
10 2825.014

Die erwünschte Ausgabe sollte dann so aussehen:

1 18.852
2 40.336 28.17
3 75.192 61.6195
4 163.575 99.795
5 274.782 163.9005
6 491.376 267.909
7 810.6 455.3665
8 1402.109 581.0395
9 1972.679 711.4525
10 2825.014

Ich hoffe, das hilft Euch weiter.

Vielen Dank im voraus.

Hubert
 
Hallo
Sorry, die Shell hattest du angegeben. Das habe ich übersehen.
War wohl ein wenig spät.

Ich sehe hier aber nicht, wo du auf Werte jenseits einer aktuelle Zeile zugreifen müsstest. :think:

Normalerweise brauchst du doch nur die Werte x und y und die hast du ja.

Um die Werte als Fließkommazahl zu ermitteln, brauchst du bc.
Oder du verwendest perl oder awk.
Beispielsnippel
Code:
while read x y;
do
if [ -z "$y" ];
then
echo "Kein y gefunden"
else
W=$(echo "scale=4;1/2 * ($y * ($x+1) - $y*($x-1))"|bc);
echo $x $y $W;
fi
done <Input

Das ist sicher nicht genau das was du willst, aber wie oben gesagt fehlt die Marke, wo mit Wertermittlung begonnen wird.
Ich habe hier einfach angenommen, dass alle Werte genommen werden, solange ein y vorhanden ist.

Das für alle dateien:
Eine Schleife über find.
Code:
for F in $(find /path -type f -name "*txt"); do 
...
done

Gruß Wolfgang
 
Problem erledigt

Hallo !

Da hast Du mich wohl nochmal falsch verstanden.

Mit (y(x+1) - y(x-1)) habe ich die Werte von y an der Stelle x+1 bzw. x-1 gemeint, also keine Multiplikation.

Ich habe aber mittlerweile eine Lösung gefunden (am Anfang ganze Tabelle in ein 2dim Array einlesen und dann darauf zugreifen).

Vielen Dank auf jeden Fall für Deine Hilfe.

Hubert
 

Ähnliche Themen

Xinerama und ATI Treiber?

Zurück
Oben