Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/06/2014, à 16:17

McRbt

[Résolu] Ajouter un point-virgule au bout de X caractère(s)

Bonjour,

J'écris un script pour traiter des fichiers csv.
J'ai une ligne de cette forme là, soit X un caractère tel qu'il soit : 00;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Je voudrais qu'un point-virgule se place au 2ème caractère, au 7ème, au 13ème, au 21ème et au 29ème.
Ce qui me donnerai : 00;XX;XXXXX;XXXXXX;XXXXXXXX;XXXXXXXX;XXXXXXXXXXXX.

J'avais penser à un sed -i, puisque cette modification doit s'effectuer sur le fichier passer en paramètre.

Pouvez-vous m'orienter ?

Dernière modification par McRbt (Le 23/06/2014, à 16:52)

Hors ligne

#2 Le 20/06/2014, à 17:50

pingouinux

Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)

Bonjour,

sed -r 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv

Ajouter -i si c'est bon

sed -ri 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv

Hors ligne

#3 Le 23/06/2014, à 09:33

McRbt

Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)

pingouinux,

J'ai testé ta ligne de commande. A première vue, elle a l'air de fonctionner, cependant cela ne dois affecter que la première ligne.
J'ai essayé :

head -1 fichier.csv | sed -r 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv

et :

sed -n 's/\r//;1p' fichier.csv | sed -r 's/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv

Sans résultat concluant.

Dernière modification par McRbt (Le 23/06/2014, à 09:33)

Hors ligne

#4 Le 23/06/2014, à 09:43

pingouinux

Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)

Voilà !

sed -r '1s/(.*;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv

Hors ligne

#5 Le 23/06/2014, à 10:41

McRbt

Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)

pingouinux,

Tout simplement.
Cependant, peut-on lui indiquer qu'il faut commencer après le 00; ?
Est-ce bon comme ceci ?

sed -r '1s/(00;)(.{2})(.{5})(.{6})(.{8})(.{8})(.*)/\1\2;\3;\4;\5;\6;\7/' fichier.csv

Puis, j'ai remarqué que si on relancais le script, après l'avoir lancé, des ; s'insérer un peu n'importe où.

Dernière modification par McRbt (Le 23/06/2014, à 10:47)

Hors ligne

#6 Le 23/06/2014, à 11:53

pingouinux

Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)

Évidemment, si tu modifies les spécifs au fur et à mesure… hmm

Cette commande traitera la 1ère ligne du fichier, si elle commence par "00;", et ne contient aucun autre ";".

sed -r '1s/^(00;)([^;]{2})([^;]{5})([^;]{6})([^;]{8})([^;]{8})([^;]*)$/\1\2;\3;\4;\5;\6;\7/' fichier.csv

Hors ligne

#7 Le 23/06/2014, à 16:21

McRbt

Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)

pingouinux,

pingouinux a écrit :

Évidemment, si tu modifies les spécifs au fur et à mesure… hmm

Autant pour moi, je n'ai pas été assez précis.
Mais sinon tu as résolu mon problème, je passe en résolu.

J'ai encore une question pour toi, comment peut-on supprimer les blancs présents à la première et dernière ligne ? Si possible avec un sed -i, puisque le fichier en entrée doit être modifié.
J'ai pensé à un truc dans ce style :

sed -ni 's/\r//; 1p'  fichier.csv | tr -d ' '
sed -ni 's/\r//; $p'  fichier.csv | tr -d ' '

Dernière modification par McRbt (Le 23/06/2014, à 16:22)

Hors ligne

#8 Le 23/06/2014, à 16:32

pingouinux

Re : [Résolu] Ajouter un point-virgule au bout de X caractère(s)

Pour supprimer les blancs des première et dernière lignes

sed '1s/ //g;$s/ //g' fichier.csv

et pour supprimer aussi '\r'

sed '1s/[\r ]//g;$s/[\r ]//g' fichier.csv

Ajouter ensuite -i si c'est bon

sed -i .....

Ajouté :
Autre façon de faire

sed '1ba;$ba;b;:a;s/[\r ]//g' fichier.csv

ou bien

sed '1!{$!b};s/[\r ]//g' fichier.csv

Dernière modification par pingouinux (Le 24/06/2014, à 07:24)

Hors ligne