亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 有2個公式的文本數據處理問題? [打印本頁]

作者: tengfei0311    時間: 2016-01-05 16:25
標題: 有2個公式的文本數據處理問題?
本帖最后由 tengfei0311 于 2016-01-06 14:06 編輯

如何用bash shell腳本處理一下文件:

  1.        第1列        第2列      第3列(C0)  第4列(A1)   第5列(A2)
  2. 文件:1.dat
  3.         90.0000   33.0000    3.0841      0.0000       -0.0052   
  4.         90.5000   33.0000    3.0787      0.0003       -0.0071   
  5.         91.0000   33.0000    3.0694      0.0005       -0.0094   
  6.         91.5000   33.0000    3.0564      0.0006       -0.0116   
  7.         (共2000行)
復制代碼
根據上面一個文件1.dat,對第4列和第5列經過公式轉換成下面一個文件,前三列值不變,第4,5列的A和θ計算公式為:
要得到下面文件:

  1. 第1列    第2列    第3列(C0)              第4列                 第5列
  2. 90.0000   33.0000    3.0841           A                        θ   
  3. 90.5000   33.0000    3.0787           A                        θ
  4. 91.0000   33.0000    3.0694           A                        θ  
  5. 91.5000   33.0000    3.0564           A                        θ
  6. 92.0000   33.0000    3.0430           A                        θ
復制代碼
想用bash shell來實現(xiàn)這個文本處理功能,菜鳥我不知道該怎么處理,謝謝各位!
作者: bikkuri    時間: 2016-01-05 17:16
  1. [root@hp8:~]# cat file
  2.         90.0000   33.0000    3.0841      0.0000       -0.0052
  3.         90.5000   33.0000    3.0787      0.0003       -0.0071
  4.         91.0000   33.0000    3.0694      0.0005       -0.0094
  5.         91.5000   33.0000    3.0564      0.0006       -0.0116
  6. [root@hp8:~]# cat file|awk '{a1=$1;a2=$2;m=a1*a1+a2*a2;n=a1/a2;cmd1="echo \"scale=4; sqrt("m")\"|bc -l";cmd1|getline a;cmd2="echo \"scale=4; 0.5*a("n")\"|bc -l";cmd2|getline t;print$1,$2,$3,a,t}'
  7. 90.0000 33.0000 3.0841 95.8592 .6096
  8. 90.5000 33.0000 3.0787 96.3288 .6105
  9. 91.0000 33.0000 3.0694 96.7987 .6114
  10. 91.5000 33.0000 3.0564 97.2689 .6123
  11. [root@hp8:~]#
復制代碼
回復 1# tengfei0311


   
作者: jason680    時間: 2016-01-05 17:37
回復 1# tengfei0311

$ awk '{OFS="\t";a=$4;b=$5;$4=sqrt(a*a+b*b);$5=0.5*atan2(a,b)}1' 1.dat
90.0000        33.0000        3.0841        0.0052        1.5708
90.5000        33.0000        3.0787        0.00710634        1.54968
91.0000        33.0000        3.0694        0.00941329        1.54423
91.5000        33.0000        3.0564        0.0116155        1.54496

   
作者: tengfei0311    時間: 2016-01-05 17:48
回復 2# bikkuri

謝謝您的幫助 好像你求出的四五列值不對啊   
作者: tengfei0311    時間: 2016-01-05 18:19
本帖最后由 tengfei0311 于 2016-01-05 18:25 編輯

回復 3# jason680


謝謝您的幫助,中間有一點不懂。
  1. $5=0.5*atan2(a,b)}1
復制代碼
這里的1是什么意思呢?
   
作者: jason680    時間: 2016-01-05 18:23
回復 5# tengfei0311

http://72891.cn/thread-2309494-1-1.html
awk初學之常見問題
1. awk ‘{code}1’ 中的“1”是干什么的?
...
   
作者: tengfei0311    時間: 2016-01-05 18:55
回復 3# jason680

您好,我想問一下,0.5*atan2(a,b) 用這個atan求出來的值是不是一個弧度值?  這里我想要一個角度值。用arctan求,就是求反函數 。這里這樣寫是不是不對?


   
作者: jason680    時間: 2016-01-05 19:07
回復 7# tengfei0311

弧度與角度

2 * pi = 2 * 3.1415926 = 圓 = 360度
      pi =  3.1415926 = 半圓 = 180度

弧度 = 角度 / 180 * pi
角度 = 弧度 / pi * 180
作者: tengfei0311    時間: 2016-01-05 19:16
回復 8# jason680


你這樣就是對的嗎?我只是看見別人論文里面都是arctan或者tan-1  我不知道atan跟arctan本質區(qū)別。

我看見別人用matlab寫的code是這樣的形式
  1.     MagAzim(i,2) = 0.5*atan2(cdata(i,6),cdata(i,5));
復制代碼

作者: jason680    時間: 2016-01-05 19:26
回復 9# tengfei0311


https://www.gnu.org/software/gawk/manual/gawk.html#Numeric-Functions

9.1.2 Numeric Functions

The following list describes all of the built-in functions that work with numbers. Optional parameters are enclosed in square brackets ([ ]):

atan2(y, x)

    Return the arctangent of y / x in radians. You can use ‘pi = atan2(0, -1)’ to retrieve the value of pi.

cos(x)

    Return the cosine of x, with x in radians.

...
   
作者: tengfei0311    時間: 2016-01-05 20:03
回復 10# jason680

A1=0.0000      A2=-0.0052

  因為A1=0 算出來的值應該是0才對


$5=0.5*atan2(a,b)  你用這個怎么算出來了值為1.5708? 大哥能再幫我看看嘛 謝謝 是不是有點問題,前面一個公式計算沒有問題



作者: jason680    時間: 2016-01-05 21:09
回復 11# tengfei0311

$ echo 0 1 5 10 170 175 180 | awk 'BEGIN{pi=atan2(0,-1)}function d2r(d){return d/180*pi}function r2d(r){return r/pi*180}function tan(r){return sin(r)/cos(r)}{for(n=1;n<=NF;n++){t=tan(d2r($n));d=r2d(atan2(t,1));d180=d>=0?d:180+d;printf("tan(%3d)=%9.6f ,arctan=%3.0f(90~0~-90), artan=%3.0f(0~180)\n",$n,t,d,d180)}}'
tan(  0)= 0.000000 ,arctan=  0(90~0~-90), artan=  0(0~180)
tan(  1)= 0.017455 ,arctan=  1(90~0~-90), artan=  1(0~180)
tan(  5)= 0.087489 ,arctan=  5(90~0~-90), artan=  5(0~180)
tan( 10)= 0.176327 ,arctan= 10(90~0~-90), artan= 10(0~180)
tan(170)=-0.176327 ,arctan=-10(90~0~-90), artan=170(0~180)
tan(175)=-0.087489 ,arctan= -5(90~0~-90), artan=175(0~180)
tan(180)=-0.000000 ,arctan= -0(90~0~-90), artan=180(0~180)




0.5*atan2(a,b)
change to
0.5*atan2(a/b,1)        # note: b cannot be 0
   
作者: tengfei0311    時間: 2016-01-05 21:57
回復 12# jason680

謝謝您!終于搞定了。
   




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2