2
votes

Comment faire des opérations mathématiques dans une seule colonne dans bash et / ou en utilisant awk?

J'ai une colonne de plusieurs lignes comme celle-ci:

20.000
15.000
42.500
42.500
45.000
45.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000

et je dois me retrouver avec un fichier où:

le premier élément est 20/2 p>

le deuxième élément est la valeur précédente + 15/2

le troisième élément est les valeurs précédentes + 42,5 / 2

et ainsi de suite jusqu'à la fin

Mon problème est de savoir comment faire la "boucle".


1 commentaires

c'est total cumulé aka somme glissante par deux.


5 Réponses :


3
votes

Perl à la rescousse:

perl -lne 'print $s += $_ / 2' input-file > output-file
  • -l supprime les retours à la ligne de l'entrée et les ajoute à la sortie
  • -n lit l'entrée ligne par ligne, exécutant le code pour chaque
  • $ _ est la valeur lue sur chaque ligne
  • / 2 est une division par 2
  • + = est l'opérateur qui ajoute son côté de course à son côté gauche et stocke le résultat dans le côté gauche, renvoyant la nouvelle valeur. J'ai nommé la variable $ s comme dans "sum".


0 commentaires

0
votes

Je suppose que vous avez besoin de la sortie sur une seule ligne:

awk '{s+=$1/2; out = out s " ";} END{print out}' file
#=> 10 17.5 38.75 60 82.5 105 130 155 180 205 230 255 280 305 330

Il y a un espace supplémentaire à la fin qui, je pense, ne fait aucun mal.
Vous pouvez le supprimer si vous ne le souhaitez pas.


0 commentaires

1
votes

Essayez ceci:

10.000
17.500
38.750
60.000
82.500
105.000
130.000
155.000
180.000
205.000
230.000
255.000
280.000
305.000
330.000


Entrée:

20.000
15.000
42.500
42.500
45.000
45.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000
50.000


Résultat:

awk '{prev += ($0) / 2; printf("%.3f\n", prev);}' a2.txt 



0 commentaires

0
votes

Je pense que vous pourriez rechercher pour la boucle

awk -F ":" '{}' filename

rappelez-vous une chose, i fait référence un numéro de colonne si vous souhaitez exécuter cette opération dans une seule colonne, vous pouvez modifier la valeur de

i = numéro de colonne; i

Vous pouvez utiliser cette boucle pour un scénario complexe.

Si vous voulez changer le séparateur, vous pouvez utiliser un paramètre comme -F et le séparateur .

awk '{for (i = 1; i <= NF; i++) print  temp = temp + $i/2  }' filename

 entrez la description de l'image ici


0 commentaires

1
votes

simplement ,

$ awk '{print v+=$1/2}' file

10
17.5
38.75
60
82.5
105
130
155
180
205
230
255
280
305
330

vous pouvez définir le formatage printf si nécessaire


0 commentaires