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".
5 Réponses :
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". 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.
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
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
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
c'est total cumulé aka somme glissante par deux.