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". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 04/09/2013, à 13: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, à 19:18)

Hors ligne

#2 Le 04/09/2013, à 14: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, à 14:52)

Hors ligne

#3 Le 04/09/2013, à 15: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, à 16:55)

Hors ligne

#4 Le 04/09/2013, à 19: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, à 19:17)

Hors ligne

#5 Le 05/09/2013, à 13: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, à 15: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, à 08: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, à 20: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, à 07: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 ↑