Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 03/12/2012, à 16:27

gody

Script avec concaténation

Bonjour,

Je travail sur un script de traitement d'une extraction au format CVS.
Voici le à quoi ressemble le fichier à traiter.

email;etat;prenom;nom;liste;pays

info@toto.ca;1;;;2;canada
gms@toto.ca;1;tutu;titi;1;france
;;;;5;;
;;;;3;;
;;;;2;;
infos@toto2.com;1;tata;tonton;1;mexique
;;;;2;;
info@toto3.com;1;;;2;france

On remarque que certaine ligne débutent par ;
Ce sont en faite les cellules fusionnés d'un tableau excel qui génère c'est ligne (je ne peux pas modifier le fichier excel bien entendu)
Le but du script et de récupérer le 5 eme champs des lignes commençant par ; et de le concaténer au 5 eme champ de la première ligne précédente ne commencant pas par ;

Le résultat serait semblable à celui ci.

info@toto.ca;1;;;2;canada
gms@toto.ca;1;tutu;titi;1,5,3,2;france
infos@toto2.com;1;tata;tonton;1,2;mexique
info@toto3.com;1;;;2;france

J'ai cherché plusieurs façon de faire avec while ou sed ou les deux... mais rien de concluant pour le moment.
Un petit coup de pouce serait la bienvenu.

Merci

Hors ligne

#2 Le 03/12/2012, à 16:56

tiramiseb

Re : Script avec concaténation

Moi j'y irais à la manière d'un gros bourrin :

mémorisation de chaine vide
tant que ligne pas vide {
    si ligne commence par ";" {
        ajouter 5me champ au champ de la ligne mémorisée
    } sinon {
        echo ligne mémorisée
        mémorisation de la nouvelle ligne
    }
}
echo dernière ligne mémorisée


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXème siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

Hors ligne

#3 Le 03/12/2012, à 17:04

credenhill

Re : Script avec concaténation

hello
essayer

$ awk 'BEGIN{FS=OFS=";"} $0 !~ /^;/ {x[n++]=$0; next} {c=$5; $0=x[n-1]; $5=$5 "," c; x[n-1]=$0}  END{for(m=0;m<n;)print x[m++]}' fichier.csv
info@toto.ca;1;;;2;canada
gms@toto.ca;1;tutu;titi;1,5,3,2;france
infos@toto2.com;1;tata;tonton;1,2;mexique
info@toto3.com;1;;;2;france
$ 

Hors ligne

#4 Le 03/12/2012, à 17:24

gody

Re : Script avec concaténation

tiramiseb a écrit :

Moi j'y irais à la manière d'un gros bourrin :

mémorisation de chaine vide
tant que ligne pas vide {
    si ligne commence par ";" {
        ajouter 5me champ au champ de la ligne mémorisée
    } sinon {
        echo ligne mémorisée
        mémorisation de la nouvelle ligne
    }
}
echo dernière ligne mémorisée


Merci à tous les deux pour vos réponses.
@credenhill: Cela fonctionne parfaitement, merci encore, je vais essayer l'autre proposition par curiosité smile

@tiramiseb: je ne sais pas comment conserver ma ligne précédente. J'écrase systématiquement son contenu quand on passe à la ligne suivante...

Hors ligne

#5 Le 03/12/2012, à 17:27

tiramiseb

Re : Script avec concaténation

Tu stocke la valeur dans une autre variable, genre "ligne_memorisee=$ligne". Et après à coup de sed tu peux insérer la valeur de la nouvelle ligne lue.


Wow la commande awk est vachement courte. Ça a l'air efficace... Par contre j'y pige que dalle big_smile


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXème siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

Hors ligne

#6 Le 03/12/2012, à 17:33

pingouinux

Re : Script avec concaténation

Bonjour,
Autre solution avec awk, un peu plus longue que celle de credenhill #3 :

awk 'BEGIN{FS=";";OFS=";"} { if($0~/^;/) { c5=c5","$5; } else { lig=$0; if(ligold) { $0=ligold; $5=$5""c5; c5=""; print} ligold=lig } } END{if(ligold) { $0=ligold; $5=$5""c5;; print }}' fichier.csv

En ligne

#7 Le 03/12/2012, à 17:35

tiramiseb

Re : Script avec concaténation

je peux pas m'empecher une blague nulle :

voir une ligne comme ça ça me donne envie de dire "awwwkkkkk"...
roll


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXème siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

Hors ligne

#8 Le 03/12/2012, à 17:46

pingouinux

Re : Script avec concaténation

@tiramiseb #7 : J'admets que cette commande peut paraître légèrement rébarbative, mais elle peut être décomposée en plusieurs lignes.

En ligne

#9 Le 03/12/2012, à 21:29

gody

Re : Script avec concaténation

Est il possible avec sed d'avoir plusieurs motifs de recherche? je n'ai pas trouvé sur mon ami google.

sed 's/recherche1 ou recherche2/remplacement/g'

merci

Edit j'ai rien dit...

Dernière modification par gody (Le 03/12/2012, à 21:38)

Hors ligne

#10 Le 03/12/2012, à 21:34

tiramiseb

Re : Script avec concaténation

si c'est pour du "ou", alors tu peux le faire en deux fois, ce sera plus facile à aborder :

sed 's/recherche1/replacement/g;s/recherche2/remplacement/g'


Sébastien Maccagnoni-Munch - administrateur Linux depuis le XXème siècle
Consultant informatique indépendant - http://www.smm-informatique.fr
Geek et tout plein d'autres choses - http://www.tiramiseb.fr

Hors ligne

#11 Le 03/12/2012, à 21:39

gody

Re : Script avec concaténation

tiramiseb a écrit :

si c'est pour du "ou", alors tu peux le faire en deux fois, ce sera plus facile à aborder :

sed 's/recherche1/replacement/g;s/recherche2/remplacement/g'

J'avais oublié l'utilisation des parenthèses pour un ou logique...
sed -re  '/;(Qc|QC)$/!d'

Hors ligne

Haut de page ↑