#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é
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,
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