Multiplier fichier vi avec un shell

Résolu/Fermé
jess75 - 22 avril 2008 à 13:17
 jess75 - 22 avril 2008 à 14:53
Bonjour,
j'ai une liste de chiffres (en colonne) dans un fichier vi.
j'aimerais tous les multiplier et créer ainsi un nouveau fichier.
je pensais le faire grâce à un shell.
Est-ce possible?
j'arrive à copier élément par élément mais pas à multiplier

merci d'avance
A voir également:

7 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2008 à 13:19
Salut,

Rien compris ! :-\

vi c'est un éditeur pas un fichier !!!
0
ok ok
je vais essayer d'être plus claire
j'ai une colonne rempli de chiffres
je veux multiplier cette colonne
est-ce que je peux le faire avec un shell?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2008 à 13:39
Oui ;-))
[jp@MDK-2008 trash]$ cat plop
1
2
3
4
5
6
7
8
9
[jp@MDK-2008 trash]$ while read line; do echo "$line x 2 = $((line * 2))";done < plop
1 x 2 = 2
2 x 2 = 4
3 x 2 = 6
4 x 2 = 8
5 x 2 = 10
6 x 2 = 12
7 x 2 = 14
8 x 2 = 16
9 x 2 = 18
[jp@MDK-2008 trash]$ 
;-))
0
merci
ça marche presque...
il ne veut pas multiplier mes décimaux dont le séparateur est un point,
ça marche si ce sont des virgules
@jess> cat test1
0.25
0.375
0.5
0.625
0.75
@jess> while read line; do echo "$line x 2 = $((line * 2))";done < test1
ksh: 0.25: unexpected `.'

par contre

@jess> while read line; do echo "$line x 2 = $((line * 2))";done < test1
0,25 x 2 = 50
0,375 x 2 = 750
0,5 x 2 = 10
0,625 x 2 = 1250
0,75 x 2 = 150


je vais être obligée de transformer tous les points en virgules?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2008 à 14:01
 while read line; do echo "$line x 2 = " $(echo "$line * 2" | bc);done < plop
;-))
0
ça marche impec merci
mais
en fait j'ai plusieurs colonne
A1 0.25 0.375
A1 0.375 0.25
A1 0.5 0.5
A1 0.625 0.625
A1 0.75 0.75

ce serait possible d'obtenir quelque chose comme?
A1 0.50 0.750
A1 0.750 0.50
A1 1.0 1.0
A1 1.250 1.250
A1 1.50 1.50

C'est sûrement simple mais je débute....
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2008 à 14:18
Oui avec "awk" c'est relativement simple, à part que "awk" ne veut pas de point comme séparateur décimal ;-((

Voici une solution avec "sed" et "awk" :
[jp@MDK-2008 trash]$ cat plop
A1 0.25 0.375
A1 0.375 0.25
A1 0.5 0.5
A1 0.625 0.625
A1 0.75 0.75

[jp@MDK-2008 trash]$ sed 's/\./,/g' plop |  awk '{ print $1, ($2*2), ($3*2) }' | sed 's/,/\./g'
A1 0.5 0.75
A1 0.75 0.5
A1 1 1
A1 1.25 1.25
A1 1.5 1.5

[jp@MDK-2008 trash]$
;-))
0
je touche à la fin de mon probleme

j'ai essayé plusieurs fois mais il y a toujours une erreur
j'ai verifié les espaces etc


@jess> cat test1
A1 core 0.25 0.375 0.25
A1 core 0.375 0.25 0.5
A1 core 0.5 0.5 0.75
A1 core 0.625 0.625 0.375
A1 core 0.75 0.75 0.625
@jess> sed 's/\./,/g' test1 | awk '{ print $1, print $2, ($3*2), ($4*2) }' | sed 's/,/\./g'
awk: { print $1, print $2, ($3*2), ($4*2) }
awk: ^ syntax error


awk n'accepterait qu'un seul print?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
22 avril 2008 à 14:48
Salut,

avec perl ;-)
lami20j@debian:~/trash$ cat plop
A1 0.25 0.375
A1 0.375 0.25
A1 0.5 0.5
A1 0.625 0.625
A1 0.75 0.75
lami20j@debian:~/trash$ perl -ne '$,=" ";($x,$y,$z)=split /\s+/,$_;print $x,2* $y,2*$z,"\n"' plop
A1 0.5 0.75
A1 0.75 0.5
A1 1 1
A1 1.25 1.25
A1 1.5 1.5
lami20j@debian:~/trash$ perl -ne 's/(.*?)\s+(.*?)\s+(.*)/$1 ." ".2*$2 ." ".2*$3/eg;print' plop
A1 0.5 0.75
A1 0.75 0.5
A1 1 1
A1 1.25 1.25
A1 1.5 1.5


0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
22 avril 2008 à 14:49
Un seul print suffit ;-))
sed 's/\./,/g' test1 | awk '{ print $1, $2, ($3*2), ($4*2) }' | sed 's/,/\./g' 
PS. Ne l'écoute pas, Perl c'est pour les faignants ;-DDD
0
et voila problèmes résolus

merci beaucoup

bonne fin de journée
0