2015-08-18 1 views
1

Je suis en train de traiter des fichiers volumineux avec des valeurs qui ressemblent, par ex. comme celui-ci (toujours 2 colonnes, mais plus de 100 000 lignes):calcul de la dérivée pour chaque ligne d'un fichier avec plus de 100 000 lignes

1,3 1,5

2,5 2,0

3,6 6,0

4,0 10,1

7,8 11,5

Pour ces fichiers que je veux calculer le dérivé comme: (2.0-1.5)/(2.5-1.3) & puis (6.0-2.0)/(3.6-2.5) et ainsi de suite. J'ai écrit un fichier Scilab qui lit dans la matrice x à partir du fichier (test.txt) et fait ensuite une boucle forcée où les dérivées sont calculées. Voici ma version:

[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 

Mes questions sont de deux ordres:

1) le calcul de plus de 100 000 lignes prend beaucoup de temps -> est-il possible de le faire plus vite? Ou est-ce seulement possible quand le nombre de lignes est réduit (par exemple en considérant seulement chaque 1000ème étape?)

2) Puisque je veux faire cela dans un script Linux: y at-il un moyen facile de le faire dans awk ou avec un autre outil linux (comme sed ...)?

Merci beaucoup pour votre aide!

Stephan

Répondre

0

Avec Scilab, vous pouvez procéder comme suit

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

fonctionne très bien, merci! –

3

donner cette ligne un essai:

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

sortie avec votre exemple des données:

0.4 
3.6 
10.3 
0.4 

Si le résultat est pas ce que vous voulez, s'il vous plaît donner un exemple de sortie prévue .

+0

fonctionne vraiment bien et très vite! merci beaucoup! –