プロが教えるわが家の防犯対策術!

風の水平成分と鉛直成分の値が入ったファイル、horizon.txtとvertical.txtがあり、これらの値を用いて風向を求めたいのですが、上手く出来ません。

以下のように組んでみたのですが、何が間違っているか教えていただけないでしょうか。
paste horizon.txt vertical.txt | awk '{if($1>0){print(90-atan($2/$1)*180/M_PI())+180}else if($1<0)print{(90-atan($2/$1)*180/M_PI())}else 0}'

ちなみにexcelでは、
=IF($1>0,(90-ATAN($2/$1)*180/PI())+180,IF($1<0,(90-ATAN($2/$1)*180/PI()),0))
で計算出来ました。

A 回答 (1件)

実行したとき、エラーメッセージは出てないですか?



Linuxということで、awkはGNU awkだと思いますが、手許のGNU Awk 4.0.2では
gawk: コマンドライン:1: {if($1>0){print(90-atan($2/$1)*180/M_PI())+180}else if($1<0)print{(90-atan($2/$1)*180/M_PI())}else 0}
gawk: コマンドライン:1: ^ syntax error
gawk: コマンドライン:1: {if($1>0){print(90-atan($2/$1)*180/M_PI())+180}else if($1<0)print{(90-atan($2/$1)*180/M_PI())}else 0}
gawk: コマンドライン:1: ^ syntax error
gawk: コマンドライン:1: {if($1>0){print(90-atan($2/$1)*180/M_PI())+180}else if($1<0)print{(90-atan($2/$1)*180/M_PI())}else 0}
gawk: コマンドライン:1: ^ syntax error

と、間違いの箇所を指摘してくれます。(ここのシステムの関係上、スペースがまとめられてしまいますが、実際は^sytan errorの位置が、間違い箇所の下にあります)


現在のものは、単純な{}の間違いがあります。
これを修正すると、次に
gawk: コマンドライン:1: (FILENAME=- FNR=1) 致命的: 関数 `atan' は定義されていません
とエラーが出ます。
マニュアルを読むと、たしかに「atan」という関数は定義されていません。ついでに、「M_PI」という関数もありません。
http://www.gnu.org/software/gawk/manual/html_nod …

tanの逆関数は、 atan2を使います。
atan(y/x) = atan2(y,x) です。
また、同じところに、πとして atan2(-1,0) を使う、というのがあります。

atan2はatanに比べて優れている点があります。

atanでは、x<0,y<0 と x>0,y>0 の区別ができないうえ、x=0の時は計算不能でした。そのためにxの正負によって+180しているはずです。
# ちなみに、$1=0のとき、実際は$2>0なら90,$2<0なら-90が答えになるはずです。
# どちらも 0になっているのは間違いです。

atan2では、x<0,y<0 と x>0,y>0 を区別し、それぞれの象限にあった角度を返します。x=0のときもyに対応してちゃんと±π/2を返します。よって、$1によって条件分けする必要がなく
{print (90-atan2($2,$1)*180/atan2(0,-1) +180) }
これだけで済みます。

なお、atant2(0,0)=0になります。実際は、無風で、角度も無いはずですが、上記では 90度という答えになります。
これをこのままにするか、場合分けして強制的に特別な値にするかは、目的に合せてください。


ちなみに。Excelにもatan2があります。これを使うと同様にif関数を使わずに記述できます。
    • good
    • 0
この回答へのお礼

上手いこと出来ました。
ご丁寧にどうもありがとうございました!

お礼日時:2013/08/15 08:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!