在bash中使用sin和cos数学函数

时间:2014-05-25 10:36:59

标签: bash math

我有一个文本文件包含这样的数据列:

 col1     col2    col3    col4   col5  col6    col7   col8    col9  col10

50.000   7.920    0.509   11.2   2.60  192.7  25.71  0.3490  188.6  17.81
50.170   7.920    0.609   12.2   2.72  211.7  26.17  0.3326  213.8  18.19
50.330   7.920    0.712   14.1   2.92  218.9  28.17  0.3228  215.1  21.73
...

我想创建另一个分隔文本文件(使用bash脚本),该文件源自第一个,其列具有以下值的值:

col1      col2      col3      col3*[-sin(col6)]     col3*[-cos(col6)]
...

sin是正弦函数,cos是数学中的余弦函数。 我该怎么做?

提前致谢。

3 个答案:

答案 0 :(得分:2)

试试这个awk命令,

awk '{var=$3*-sin($6); foo=$3*-cos($6); print $1,$2,$3,var,foo;}' file

答案 1 :(得分:1)

我使用bc的更长版本:

awk '{printf "%f * -s (%f);\n", $3, $6}' < input.txt  | bc -l > col4.txt
awk '{printf "%f * -c (%f);\n", $3, $6}' < input.txt  | bc -l > col5.txt
awk '{print $1, $2, $3}' < input.txt | paste -d " " - col4.txt col5.txt

答案 2 :(得分:1)

有了这种需要,bash是不够的。尝试 bashj (一个支持java的bash变种)https://sourceforge.net/projects/bashj/。它旨在满足您的需求(以及更多)。三角函数:

#!/usr/bin/bashj
X=0.5
COSX=Math.cos($X)

您也可以将自己的方法放在bashj加载的jar中,或者在bashj脚本中包含一些java源代码:

#!/usr/bin/bashj
#!java
public static int factorial(int n) 
{if (n<=0) return(0);
 if (n==1) return(1);
 return(n*factorial(n-1));}
#!bashj
echo j.factorial(10)

在你的情况下,我建议使用java方法创建一个bashj文件,将数据加载到文件中的double [] [],并返回一个java函数,返回加载的Math.sin()和Math.cos()数据,使用行col索引作为参数...