我有一个文本文件,包含像这样的数据列:
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
为余弦函数。我该怎么做呢?
试试这个awk
命令,
awk '{var=$3*-sin($6); foo=$3*-cos($6); print $1,$2,$3,var,foo;}' file
我使用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
对于这种需求,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)
在您的情况下,我建议创建一个bashj文件,其中使用java方法将数据加载到文件中的double[][]中,并使用java函数返回所加载数据的Math.sin()和Math.cos(),使用row col index作为参数…