Contenu | Rechercher | Menus

Annonce

Ubuntu-fr.org recrute toujours de nouveaux modérateurs, avec de l'expérience.

Ubuntu 16.04 LTS
Réservez vos DVD et clé USB Ubuntu-fr (premières livraisons mi-mai)

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

M.A.J. en cours du forum possibilité de bug, nous faisons le maximum pour les résoudre au plus vite

#1 Le 04/09/2013, à 14:38

sab113

la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

Bonjour ,

J'ai deux questions concernant la commande sed.
Si je souhaites joindre toutes lignes qui commence par un champ particulier et se termine par un autre champ , par exemple :

<MH>
texte.......
</MH>

et avoir à la place comme résultat juste une ligne
<MH > texte ..... </MH>

j'ai essayé avec les commandes proposés sur ce site sed joindre des lignes
J'ai essayé la substitution:

sed -n '$!N;/\n<MH>/{s/\n//;P;D};p' 
sed -n '$!N;/<MH>/{s/\n//;P;D};P' 
sed -n '$!N;/<MH>\n/{s/\n//;P;D};P' 

mais je n'obtiens aucun changement.

J'aimerais également comprendre comment faire pour ré-ordonner les lignes d'un texte
si j'ai par exemple un texte :

<DOC>
....texte
<DOCNO>C0000699</DOCNO>
....texte
</DOC>

comment dois je  faire pour remonter les lignes commençant par le motif "<DOCNO>" juste après la ligne "<DOC>
et avoir un résultat comme suit:

<DOC>
<DOCNO>C0000699</DOCNO>
....texte
</DOC>

je vous remercies à l'avance pour votre aide.

Dernière modification par sab113 (Le 04/09/2013, à 20:18)

Hors ligne

#2 Le 04/09/2013, à 15:52

claudius01

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

Bonjour,

Je pense que pour ce genre de traitements, awk est plus adapté quitte à le faire en 2 passes du moins pour la remontée des lignes <DOCNO>xxx</DOCNO> en dessous de <DOC>.


Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 04/09/2013, à 15:52)

Hors ligne

#3 Le 04/09/2013, à 16:23

pingouinux

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

Bonjour,
Comme claudius01, je pense que awk est plus adapté.
Voici déjà pour la première demande :

awk '/<MH>/{ORS=" "}/<\/MH>/{ORS="\n"}{print}' fichier

Ajouté :
C'est plus compliqué pour la seconde :

awk '
   BEGIN{ORS=""}
   /<DOC>/{doc=$0;getline}
   {  if(doc) {
         if(/<DOCNO>/){ print doc"\n"$0"\n"txt;doc="";txt="" }
         else if(/<\/DOC>/){ print doc"\n"txt$0"\n";doc="";txt="" }
         else {txt=txt$0"\n"}
      }
      else {print $0"\n"}
   }
   END{if(doc)print doc"\n"txt}
' fichier

Dernière modification par pingouinux (Le 04/09/2013, à 17:55)

En ligne

#4 Le 04/09/2013, à 20:16

sab113

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

Je vous remercies claudius01.
Merci vraiment pingouinux c'est très gentil de m'avoir aidé smile

Dernière modification par sab113 (Le 04/09/2013, à 20:17)

Hors ligne

#5 Le 05/09/2013, à 14:39

pingouinux

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

Il était également possible de répondre aux deux demandes en utilisant sed. Voici les solutions obtenues après quelques tâtonnements :

sed -n '/<MH>/,/<\/MH>/{H;/<MH>/h;/<\/MH>/{g;s/\n/ /g;p};b};p' fichier
sed -n '/<DOC>/,/<\/DOC>/{/<DOC>/{p;n;h;b};/<DOCNO>/{p;g;p;n;h;b};/<\/DOC>/{x;p;g;p;b};H;${g;p};b};p' fichier

En ligne

#6 Le 05/09/2013, à 16:23

claudius01

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

Bonjour,

pingouinux a écrit :

Il était également possible de répondre aux deux demandes en utilisant sed....

sed -n '/<MH>/,/<\/MH>/{H;/<MH>/h;/<\/MH>/{g;s/\n/ /g;p};b};p' fichier
sed -n '/<DOC>/,/<\/DOC>/{/<DOC>/{p;n;h;b};/<DOCNO>/{p;g;p;n;h;b};/<\/DOC>/{x;p;g;p;b};H;${g;p};b};p' fichier

Trop fort.

Cela mériterait d'être proposé (après la création d'une section Unix tools) au Concours international de code C obscur dont je suis friand comme un pris au hasard : vik.c

Bravo encore pingouinux,


Bien cordialement, A+
--
Claudius

Hors ligne

#7 Le 06/09/2013, à 09:17

credenhill

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

hello
autre solution awk

$ cat fichier
<DOC>
....texte
<DOCNO>C0000699</DOCNO>
....texte
</DOC>
$ awk '/<DOC>|<\/DOC>/ {print; p=0} /<DOCNO/ {p=1} p' fichier
<DOC>
<DOCNO>C0000699</DOCNO>
....texte
</DOC>
$ 

Hors ligne

#8 Le 06/09/2013, à 21:01

pingouinux

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

La réponse de credenhill sème le doute dans mon esprit…
Quelle est la réponse attendue par sab113 pour ce fichier ?

début
<DOC>
....texte1
....texte2
<DOCNO>C0000698</DOCNO>
....texte3
....texte4
</DOC>
fin

Pour moi, c'était

début
<DOC>
<DOCNO>C0000698</DOCNO>
....texte1
....texte2
....texte3
....texte4
</DOC>
fin

et les commandes que j'ai proposées correspondaient à cette interprétation.

En ligne

#9 Le 07/09/2013, à 08:51

credenhill

Re : la commande sed joindre des lignes + ordonnancement des lignes[Résolu]

bonne question !  mais je crois que tu as raison

Hors ligne