计算超过100 000行的文件的每行的导数

时间:2015-08-18 09:16:52

标签: linux awk scilab

我目前正在处理大型文件,其值如下所示像这样(总是2列,但超过100 000行):

1.3 1.5

2.5 2.0

3.6 6.0

4.0 10.1

7.8 11.5

对于这些文件,我想计算如下的衍生物:(2.0-1.5)/(2.5-1.3)&然后(6.0-2.0)/(3.6-2.5)等。 我写了一个Scilab文件,它从文件(test.txt)中读取矩阵x,然后执行for循环,计算导数。这是我的版本:

[x] = read('test.txt',-1,2);

i = 1;

j = 1;

s = size(x);

for i = 1:s(1,1)-1

f(i) =  (x(i+1,2)-x(i,2))/(x(i+1,1)-x(i,1))

delta(i)=((x(i+1,1)+x(i,1)))/2

i=i+1

end

我的问题有两个:

1)超过100 000行的计算需要很长时间 - >是否有可能更快地做到这一点?或者只有当行数减少时才会这样(例如,只考虑每1000步?)

2)因为我想在linux脚本中执行此操作:是否有一种简单的方法可以在awk或其他Linux工具(如sed ...)中执行此操作?

非常感谢你的帮助!

斯蒂芬

2 个答案:

答案 0 :(得分:4)

试试这行:

awk '{if(NR>1)printf "%.1f\n",($2-b)/($1-a);a=$1;b=$2}' file

输出您的示例数据:

0.4
3.6
10.3
0.4

如果结果不符合您的要求,请提供预期的输出示例。

答案 1 :(得分:0)

使用Scilab,您可以按照以下步骤进行操作

x = read('test.txt',-1,2);
f=diff(x(:,2))./diff(x(:,1))
delta=(x(2:$,1)+x(1:$-1,1))/2