Script shell pour extraire une un nombre et le doubler

Fermé
Lte_blizzard - 15 janv. 2013 à 17:55
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 - 16 janv. 2013 à 15:13
Bonjour,

Je débute en programmation shell et je galère pas mal! J'aurais besoin d'un coup de main.
Voilà, dans un dossier, j'ai un certain nombre de fichiers de structures identiques, contenant un nombre qui varie et que je dois multiplier par deux.

En gros voici l'un de ces fichiers:

[DURATION]
InSecond=30
[MODULES]
[...]

Le nombre à droite d'InSecond doit être doublé. Je dois faire ça pour tous les fichiers, sachant que ce nombre peut varier mais il se trouve toujours au même endroit.

Merci de votre aide

Je précise au cas où qu'il s'agit d'un script sh à exécuter sous cygwin...

A voir également:

3 réponses

Pas la plus belle des manières mais qui marche en bash et awk:

for file in ./*;do awk -F'=' '{if($1 == "InSecond"){print "InSecond="$2*2}else{print $0}}' $file > $file;done

Attention les nouveau fichiers écrasent les anciens
1
Lte_blizzard
15 janv. 2013 à 18:17
merci pour cette réponse hyper rapide

J'ai ajouté ton code dans mon script double_duration.sh mais j'ai le résultat suivant:
$ ./double_duration.sh
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found
awk: not found

Y-a-il quelque chose à paramétrer?
0
Lte_blizzard
15 janv. 2013 à 18:18
je précise du coup que j'ai nommé mon fichier file.txt dans un premier temps pour tester la commande...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
15 janv. 2013 à 18:19
Salut,

Oui, installer "awk" ;-\
0
La commande liste tout les fichiers du répertoire et les envois un part un à la commande awk.
Il faut que tu installe awk pour cygwin et tu n'as pas besoin de renommer les fichiers, il prend tout les fichiers du répertoire.
0
Pour un seul fichier tu peux tester avec : awk -F'=' '{if($1 == "InSecond"){print "InSecond="$2*2}else{print $0}}' ton_fichier
0
Utilisateur anonyme
15 janv. 2013 à 18:19
ATTENTION
Non seulement ça va les écraser, mais ça va même les vider, car la redirection intervient avant la lecture.
Donc, awk va lire un fichier vide :(

Il faut utiliser un fichier temporaire, puis le copier sur le fichier original.
1
Lte_blizzard
15 janv. 2013 à 18:24
merci pour cette précision, je me suis fait un répertoire temporaire pour éviter de tout péter avec mes essais
0
lte_blizzard
16 janv. 2013 à 11:50
Et comment faire pour paramétrer DES fichiers temporaires?
0
Utilisateur anonyme
16 janv. 2013 à 11:54
au lieu de rediriger $file >$file

tmpF=/tmp/fichier.tmp
for file in ./*
do
   awk ... "$file" > "$tmpF"
   cp "$tmpF" "$file"
done
0
lte_blizzard
16 janv. 2013 à 13:24
Ajout de la nouvelle redirection:

for file in ./*;do awk -F'=' '{if($1 == "InSecond"){print "InSecond="$2*2}else{print $0}}' $file > "tmp";cp "tmp" "$file";done

C'est nikel, le nombre est bien doublé dans chaque fichier!
Merci encore!
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
16 janv. 2013 à 15:13
hello
en perl, avec sauvegarde des fichers en .bak
perl -i.bak -pe 's/(^InSecond=)([0-9]+)/sprintf("%s%d", $1, $2*2)/e' fichiers*
0