Bonjour,

Je suis confronté à un problème avec la commande sed.

Voici le type de fichier que j'ai :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2019-10-29-06-00;/dev/xx;512.00;295.16;/opt/
2019-10-29-06-00;/dev/xx;128.00;106.54;/var/
2019-10-29-06-00;/dev/xx;256.00;180.79;/usr/
2019-10-29-06-00;/dev/xx;384.00;191.13;/var/
2019-10-29-06-00;/dev/xx;256.00;255.37;/var/
2019-10-29-06-00;/dev/xx;3200.00;2679.36;/var/opt/
2019-10-29-06-00;/dev/xx;256.00;255.07;/var/
2019-10-29-06-00;/dev/xx;64.00;62.67;/etc/
2019-10-29-06-00;/dev/xx;1664.00;1163.33;/opt
2019-10-29-06-00;/dev/xx;256.00;146.13;/opt/
2019-10-29-06-00;/dev/xx;2176.00;952.90;/opt/
2019-10-29-06-00;/dev/xx;22784.00;10353.91;/opt/
2019-10-29-06-00;/dev/xx;256.00;253.64;/
2019-10-29-12-00;/dev/xx;256.00;229.92;/home
2019-10-29-12-00;/dev/xx;1024.00;556.73;/opt
2019-10-29-12-00;/dev/xx;256.00;180.79;/usr/
2019-10-29-12-00;/dev/xx;384.00;190.90;/var
2019-10-29-12-00;/dev/xx;256.00;255.37;/var/
2019-10-29-12-00;/dev/xx;128.00;127.63;/
2019-10-29-12-00;/dev/xx;256.00;76.86;/opt/
2019-10-29-12-00;/dev/xx;2176.00;1682.93;/opt/
2019-10-29-12-00;/dev/xx;256.00;145.66;/opt/
2019-10-29-12-00;/dev/xx;2176.00;952.90;/opt/
2019-10-29-12-00;/dev/xx;22784.00;10421.72;/opt/
2019-10-29-12-00;/dev/xx;256.00;253.64;/
2019-10-29-18-00;/dev/xx;1024.00;138.8;/
2019-10-29-18-00;/dev/xx;5248.00;4230.34;/usr
2019-10-29-18-00;/dev/xx;2560.00;499.37;/var
2019-10-29-18-00;/dev/xx;3584.00;67.79;/tmp
2019-10-29-18-00;/dev/xx;256.00;25.9;/home
2019-10-29-18-00;/dev/xx;1024.00;467.27;/opt
2019-10-29-18-00;/dev/xx;384.00;0.38;/usr/
2019-10-29-18-00;/dev/xx;256.00;21.36;/
2019-10-29-18-00;/dev/xx;512.00;216.84;/opt/

Je souhaite, dans mon fichier, ne modifier que les lignes allant du début juqu'à la dernière ligne comprenant 2019-10-29-12-00 pour soustraire la valeur $3 à la valeur $4 et que ce résultat prenne la place de la valeur $4. J'arrive à ne cibler ces lignes qu'avec la commande :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
sed '/2019-10-29-12-00/{:a;n;//ba;Q}' test2.txt
Ce qui donne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2019-10-29-06-00;/dev/xx;512.00;295.16;/opt/
2019-10-29-06-00;/dev/xx;128.00;106.54;/var/
2019-10-29-06-00;/dev/xx;256.00;180.79;/usr/
2019-10-29-06-00;/dev/xx;384.00;191.13;/var/
2019-10-29-06-00;/dev/xx;256.00;255.37;/var/
2019-10-29-06-00;/dev/xx;3200.00;2679.36;/var/opt/
2019-10-29-06-00;/dev/xx;256.00;255.07;/var/
2019-10-29-06-00;/dev/xx;64.00;62.67;/etc/
2019-10-29-06-00;/dev/xx;1664.00;1163.33;/opt
2019-10-29-06-00;/dev/xx;256.00;146.13;/opt/
2019-10-29-06-00;/dev/xx;2176.00;952.90;/opt/
2019-10-29-06-00;/dev/xx;22784.00;10353.91;/opt/
2019-10-29-06-00;/dev/xx;256.00;253.64;/
2019-10-29-12-00;/dev/xx;256.00;229.92;/home
2019-10-29-12-00;/dev/xx;1024.00;556.73;/opt
2019-10-29-12-00;/dev/xx;256.00;180.79;/usr/
2019-10-29-12-00;/dev/xx;384.00;190.90;/var
2019-10-29-12-00;/dev/xx;256.00;255.37;/var/
2019-10-29-12-00;/dev/xx;128.00;127.63;/
2019-10-29-12-00;/dev/xx;256.00;76.86;/opt/
2019-10-29-12-00;/dev/xx;2176.00;1682.93;/opt/
2019-10-29-12-00;/dev/xx;256.00;145.66;/opt/
2019-10-29-12-00;/dev/xx;2176.00;952.90;/opt/
2019-10-29-12-00;/dev/xx;22784.00;10421.72;/opt/
2019-10-29-12-00;/dev/xx;256.00;253.64;/

Et soustraire les valeurs :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
sed '/2019-10-29-12-00/{:a;n;//ba;Q}' test2.txt | awk -F';' '{print $1";"$2";"$3";"($3 - $4)";"$5}'
Ce qui donne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2019-10-29-06-00;/dev/xx;512.00;216.84;/opt/
2019-10-29-06-00;/dev/xx;128.00;21.46;/var/
2019-10-29-06-00;/dev/xx;256.00;75.21;/usr/
2019-10-29-06-00;/dev/xx;384.00;192.87;/var/
2019-10-29-06-00;/dev/xx;256.00;0.63;/var/
2019-10-29-06-00;/dev/xx;3200.00;520.64;/var/opt/
2019-10-29-06-00;/dev/xx;256.00;0.93;/var/
2019-10-29-06-00;/dev/xx;64.00;1.33;/etc/
2019-10-29-06-00;/dev/xx;1664.00;500.67;/opt
2019-10-29-06-00;/dev/xx;256.00;109.87;/opt/
2019-10-29-06-00;/dev/xx;2176.00;1223.1;/opt/
2019-10-29-06-00;/dev/xx;22784.00;12430.1;/opt/
2019-10-29-06-00;/dev/xx;256.00;2.36;/
2019-10-29-12-00;/dev/xx;256.00;26.08;/home
2019-10-29-12-00;/dev/xx;1024.00;467.27;/opt
2019-10-29-12-00;/dev/xx;256.00;75.21;/usr/
2019-10-29-12-00;/dev/xx;384.00;193.1;/var
2019-10-29-12-00;/dev/xx;256.00;0.63;/var/
2019-10-29-12-00;/dev/xx;128.00;0.37;/
2019-10-29-12-00;/dev/xx;256.00;179.14;/opt/
2019-10-29-12-00;/dev/xx;2176.00;493.07;/opt/
2019-10-29-12-00;/dev/xx;256.00;110.34;/opt/
2019-10-29-12-00;/dev/xx;2176.00;1223.1;/opt/
2019-10-29-12-00;/dev/xx;22784.00;12362.3;/opt/
2019-10-29-12-00;/dev/xx;256.00;2.36;/

Mais là ça s'affiche juste dans mon terminal... Et si je redirige cette commande vers un fichier externe, cela va me créer un fichier qu'avec les lignes modifier. Or, moi je voudrais apporter ces modifications dans mon fichier sans perdre le reste des lignes.


Auriez-vous une solution ?


Merci d'avance !