Comment réduire avec awk, la largeur d'un champ contenu dans un enregistrement

Résolu/Fermé
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023 - Modifié le 18 févr. 2020 à 15:07
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023 - 18 févr. 2020 à 16:07
Je suis sous Ubuntu 18.04 LTS et essaie d'apprendre à me servir de awk.
J'ai un fichier csv de ce type:

a1_____       ; ______  a2;a3 _______________________  ; _____________  a4  ;  a5
b1_________ ; ___________________________ b2;___ b3; _____________________ b4 ;__ b5


et ainsi de suite sur 300 enregistrements.
(je renvoie le tableau ci-dessus car les espaces sont écrasés lorsque j'envoie le message. Je les ai donc remplacés par des tirets, mais en réalité, il s'agit d'espaces blancs !)
J'appelle champs ce qui est entouré de points-virgules (ici 5 champs et deux enregistrements)

Les a_i et b_i étant des chaines de caractères alphanumériques de longueurs variables.

Comment faire pour que chaque champ soit bien bordé, càd de sorte que la chaine alphanumérique soit systématiquement entourée d'un seul espace après et avant chaque point-virgule, càd:
a1 ; a2 ; a3 ; a4 ; a5
b1; b2 ; b3 ; b4 ; b5
etc...

J'ai cherché dans toute la documentation et n'ai pas trouvé de moyen de le faire. Quelqu'un pourrait-il m'aider ?

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
18 févr. 2020 à 15:50
Salut,

awk est une obligation ?

Parce qu'avec sed c'est très simple :
$ cat f1
a1 ;       a2    ;   a3               ;   a4     ;  a5
b1   ;     b2      ;  b3    ;         b4    ;    b5


$ sed 's/  */ /g' f1
a1 ; a2 ; a3 ; a4 ; a5
b1 ; b2 ; b3 ; b4 ; b5

1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
18 févr. 2020 à 16:01
Avec awk :

$ awk 'BEGIN{FS=OFS=";"} /;/{gsub(/  */, " ", $0); print} ' f1
a1 ; a2 ; a3 ; a4 ; a5
b1 ; b2 ; b3 ; b4 ; b5
0
Allons-y avec sed ! Non awk n'est pas une obligation. J'étudie les deux langages, actuellement
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
18 févr. 2020 à 16:03
Solution avec awk ici ;-)
0
zigroful Messages postés 20 Date d'inscription dimanche 16 février 2020 Statut Membre Dernière intervention 29 août 2023 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
18 févr. 2020 à 16:07
GRAND MERCI
0