Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
871 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell] Traitement de fichier - chaine de caractères

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Shell] Traitement de fichier - chaine de caractères

n°1175269
lalas
Posté le 12-08-2005 à 15:23:08  profilanswer
 

Bonjour à tous,
 
J'aurais besoin de votre aide pour insérer automatiquement une concaténation de chaînes de caractères dans un fichier. Je m'explique:
J'ai un fichier ldif où chaque membres de mon annuaire ldap sont décris de la façon suivante:
 

dn: uid=p1.nom1,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom1
sn: NOM1
givenName: prenom1
 
dn: uid=p2.nom2,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom2
sn: NOM2
givenName: prenom2
(...)


Et ainsi pour environ 900 personnes :sweat:  
 
Il faudrait qu'à partir des champs givenName et sn, je puisse insérer, pour chaque user, un champ cn: de la forme cn: <givenName> <sn>. Ce qui donnerais:
 
 

dn: uid=p1.nom1,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom1
sn: NOM1
givenName: prenom1
cn: prenom1 NOM1
 
dn: uid=p2.nom2,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom2
sn: NOM2
givenName: prenom2
cn: prenom2 NOM2
(...)


 
Auriez-vous quelques pistes ? Mes grep & cut habituels ne semblent plus suffirent... J'ai fouillé du côté de l'outil read utilisé aumilieu de boucles mes je galère un peu  :(  
 
Merci d'avance!

mood
Publicité
Posté le 12-08-2005 à 15:23:08  profilanswer
 

n°1175295
gagaches
Posté le 12-08-2005 à 16:05:03  profilanswer
 

tu n'a jamais essayé les scripts awk ?
 
ca te prendrait qqs minutes à faire avec un code genre :

Code :
  1. ## à chaque ligne parsée, l'afficher
  2. * { print "\n$0" } ## \n utile ??
  3. ## si la ligne commence par "sn:", mémoriser le sn
  4. $1 = "sn:" {sn = $2 }
  5. ## si la ligne est givenName, concaténer name et sn et l'afficher ensuite
  6. $1 = "givenName:"
  7.   {
  8.   name = $2
  9.   printf("\ncn: %s %s", name, sn)
  10.   }


 
le script awk parse ton fichier ligne par ligne et, pour chaque ligne, réalise les instructions à la suite ...
 
et tu n'as plus qu'à appeler ton script  
"awk tonscript.awk tonfichierannuaire.txt > tonnouveaufichierannuaire.txt"
 
va voir là pour plus d'informations sur les scripts awk :
http://w3.uqah.uquebec.ca/DOC/unx_awk.html


Message édité par gagaches le 12-08-2005 à 16:12:20
n°1175306
olivthill
Posté le 12-08-2005 à 16:11:25  profilanswer
 

Si ce n'est pas trop indiscret, pourrais-tu préciser quel est le système d'exploitation, même s'il semble que cela soit de l'unix ? Est-ce pour le Korn-shell ou le C-shell ? Est-ce que chaque paragraphe se termine toujours par une ligne vide ? Est-ce qu'il peut-y avoir des lignes vides à l'intérieur d'un paragraphe ? Ou bien faut-il insérer systématiquement au niveau de la 7eme ligne ?
 
Voici une petite solution, que je n'ai pas testée, mais qui peut donner une idée


   cat lefichier.txt | while read laligne
   do
      letag=`echo $laligne |cut -d":" -f1`
      if [ $letag = "sn" ]
      then
         lenom=`echo $laligne |cut -d":" -f2`
      fi
      if [ $letag = "givenname" ]
      then
         leprenom=`echo $laligne |cut -d":" -f2`
      fi
      if [ $laligne="" ]
      then
         echo "cn: " $leprenom " " $lenom
      fi
 
      # recopie la ligne dans stdout
      echo $laligne
 
   done


n°1175317
Taz
bisounours-codeur
Posté le 12-08-2005 à 16:21:45  profilanswer
 

utilise perl/python/ruby, y a tout ce qu'il faut pour faire du ldap simplement.

n°1175330
lalas
Posté le 12-08-2005 à 16:42:55  profilanswer
 

D'abord merci pour vos réponses!

Citation :

tu n'a jamais essayé les scripts awk ?


Non et je crois qu'il est temps de rattraper ce retard!
 

Citation :

Si ce n'est pas trop indiscret, pourrais-tu préciser quel est le système d'exploitation, même s'il semble que cela soit de l'unix ? Est-ce pour le Korn-shell ou le C-shell ? Est-ce que chaque paragraphe se termine toujours par une ligne vide ? Est-ce qu'il peut-y avoir des lignes vides à l'intérieur d'un paragraphe ? Ou bien faut-il insérer systématiquement au niveau de la 7eme ligne ?


Non pas d'Unix mais une simple Fedora 3 avec un bon vieux bash. Concernant la structure des fichiers ldif, chaque paragraphe doit se terminer par une ligne vide (et donc pas de ligne vide dans le paragraphe même) Quand à l'insertion, peu importe sa place dans le paragraphe (je la voyais bien en dernière ligne).
 

Citation :

utilise perl/python/ruby, y a tout ce qu'il faut pour faire du ldap simplement.


Ouais mais en fait il n'y a rien de spécifique à ldap là dedans. Ca aurait très bien pu être un ficher texte tout bête avec des champs identique. En plus Python et Ruby me sont complètement inconnus...
 
Mon domaine est d'habitude le réseau et c'est assez rare que j'aligne du code (à part des sh tous simple) ... Enfin je fouille tout ça et je vous tiens au courant!

n°1175386
lalas
Posté le 12-08-2005 à 17:44:22  profilanswer
 

Avec ça :
 

Code :
  1. BEGIN { FS=":" }
  2. {
  3. if ( $1 ~ /sn/ ) {
  4. sn=$2
  5. print "sn :" sn  }
  6. else {
  7. if ( $1 ~ /givenName/ ) {
  8. givenName=$2
  9. print "givenName:" givenName
  10. print "cn:" givenName sn}
  11. else print $0
  12. }
  13. }


ça marche au poil ! Encore merci de votre aide à tous !


Message édité par lalas le 12-08-2005 à 18:32:31

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell] Traitement de fichier - chaine de caractères

 

Sujets relatifs
Modification d'un fichier texte[SVG] comment mettre à jour Mysql avec un fichier SVG ? [RESOLU]
Requête SQL pour remplacer une partie de chaine...Synchronisation entre une BD et un fichier texte
[Perl] Récupérer le chemin de fichierFileExists > rechercher la présence de fichier dans un répertoire.
fichier dans .jarEcrire dans un fichier sur un client
Troncation à droite de la chaine de donnéesURL fichier distant
Plus de sujets relatifs à : [Shell] Traitement de fichier - chaine de caractères


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR