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".

#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)

Hors 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

Hors 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.

Hors 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

Haut de page ↑