ubuntuusers.de

Datei lesen und Function() übergeben

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

ergy1983

Anmeldungsdatum:
4. August 2014

Beiträge: 2

Hallo,

ich möchte den Inhalt einer Datei lesen und dann den Acos rechnen. Leider ist der ja aber nicht implementiert und man muss das selber über function() machen. Nur wie?

cat input.dat |awk '{
	function acos(x) { return atan2(sqrt(abs(1-x*x)), x) }
	function asin(x) { return atan2(x, sqrt(abs(1-x*x))) }
	function pi() { return 2*asin(1);}
	gamma=acos(($1*$1)/(2*$3*$1))
	print gamma
}'

So funktioniert es leider nicht. Weiß jemand, wo und wie man diese function() zum Lauen bringt... Entschuldigt bitte die vielleicht doofe Frage, aber ich habe nichts so richtig gefunden und kriege es einfach nicht hin. Danke für jede Hilfe, Ergy

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Ergy,

erstmal herzlich willkommen hier auf dem Forum !

Für solche mathematischen Dinge ist es normalerweise am einfachsten, bc zu benutzen, nur dass bc den acos() von Hause aus auch nicht hat ...
Allerdings gibt es die extensions_bc, und dort ist der acos() als Bibliotheksfunktion vorhanden.

Jetzt kannst Du Dir überlegen, was einfacher ist: die extensions_bc zu installieren und bc zu füttern, oder den Kram selber mit awk nachzubauen. (wie Du es im Prinzip gemacht hast)

Zu der awk- Funktion: woran hast Du Dich da orientiert ? - bist Du nach man awk vorgegangen, oder nach einer anderen Anleitung ?

LG,

track

u1000

Anmeldungsdatum:
2. Oktober 2011

Beiträge: 1850

Hi,

abgesehen davon, dass das kein gültiger awk ist, hast du noch ein ganz anderes Problem:

awk hat leider auch keine abs() Funktion... auch die müstest du selber definieren...

Beispiel Syntax ohne abs, alle Zeilen zum Ausführen ins Terminal kopieren, inkl letztem Hochkomma:

echo 0,5 |awk '{ \
	gamma=acos($1); \
	print gamma; \
} \
	function acos(x) { return atan2(sqrt((1-x*x)), x) } \
	function asin(x) { return atan2(x, sqrt((1-x*x))) } \
	function pi() { return 2*asin(1);} \
'

VG u1000

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Du kannst es Dir auch einfacher machen und etwas anderes nehmen:

$ echo 0.5 | ruby -ne '$_.scan(/[-+]?\d+(?:\.\d+)?/) {|m| puts Math.acos(Float(m))}'
1.0471975511965979 

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

möglich wäre auch

echo "puts [expr acos( -1 )]" | tclsh
Antworten |