Voici une version pur bash:
1 2 3 4 5 6 7 8
| $ cat toto.txt
2;3;5
3;4;6
$ multi_by(){ VAR=$1 ; XX="" ;[ $2 -ne 0 ] && for i in ${MAPFILE[$(($2-1))]//\;/ } ; do echo -n "$XX$((i*VAR))";XX=";"; done ; echo ;} ; mapfile -t -c 1 -C "multi_by 4" <toto.txt
8;12;20
12;16;24 |
Celle-ci passe par la création d'une fonction qui écrit au format indenté donne:
1 2 3 4 5 6 7 8 9 10
| multi_by(){
VAR=$1
XX=""
[ $2 -ne 0 ] && for i in ${MAPFILE[$(($2-1))]//\;/ }
do
echo -n "$XX$((i*VAR))"
XX=";"
done
echo
} |
Et ensuite on l'appelle en lui passant la valeur multiplicative (4 dans l'exemple) et via la builtin mapfile pour lui fournir directement les données ligne par ligne du fichier toto.txt
mapfile -t -c 1 -C "multi_by 4" <toto.txt
Ici, comme on peut le voir, nous encadrons de guillemets la fonction d'appel avec l'argument multiplicateur, ce qui fait que mapfile mettra l'indexage du tableau dans $2 au lieu de $1 et la valeur courante de la ligne lu dans $3.
D'ailleurs, on peut très bien ne pas passer par le tableau MAPFILE, ce qui donnerait une fonction multi_by plus simple:
1 2 3 4 5 6 7 8 9 10 11
| multi_by(){
VAR=$1
XX=""
VAL=$3
for i in ${VAL//\;/ }
do
echo -n "$XX$((i*VAR))"
XX=";"
done
echo
} |
Celle-ci est plus simple, car le fait de passer par le tableau MAPFILE, nous sommes obligé de lire la ligne précédente et non courante, car celle-ci (ligne courante) ne sera insérée dans le tableau qu'a la sortie de la fonction.
Partager