2 votes

bash : (( : ave=total/numLines : division par 0 ( le jeton d'erreur est "numLines ")

J'écris un bash script et j'obtiens cette erreur :

bash:  ((: ave=total/numLines : division by 0 (error token is "numLines ")

Et voici mon code :

total="$( cut -d '|' -f ${array[$index]} folder/${files[$x]} | awk '{ sum += $1 } END { print sum }' )"

numLines="$( cut -d '|' -f ${array[$index]} folder/${files[$x]} | awk 'NF' | wc -l )"

(( ave=total/numLines ))

La valeur de la variable 'ave' a pu être calculée et imprimée correctement, mais je continue à obtenir l'erreur 'division par 0'. J'ai essayé d'attribuer une valeur à 'numLines' au début mais cela ne semble pas fonctionner.

Qu'est-ce qui ne va pas et comment puis-je le réparer ?

0voto

Dennis Williamson Points 105818

Dans le prolongement des commentaires de @Barmar et des miens :

AWK peut extraire des champs avec des délimiteurs différents (pas besoin de cut ):

read -r total ave <<< "$(awk -F '|' -v field=${array[$index]} 'NF { sum += $field; count++ } END {print sum, sum/count}' "folder/${files[$x]}")"

Notez que dans sum += $field le signe dollar fait en sorte que le numéro de champ contenu dans la variable field pour faire référence au contenu de ce champ. (Il ne s'agit pas d'une désignation de variable telle que celle utilisée dans Bash.) L'option -v est la façon de passer une variable Bash à AWK en tant que variable AWK. Le modèle utilisé ici ( NF ) correspond à toutes les lignes non vides et l'action est entourée du symbole {} . El END est spécial et est exécuté lorsque toutes les entrées ont été consommées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X