Transformer plusieurs lignes en une seule avec awk et séparateur ;

Signaler
-
Messages postés
18148
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
3 juillet 2020
-
Bonjour,

J'ai un fichier qui se présente sous cette forme :
#?BEGIN_SITE
alias=***
ip=***
...
..
#?END_SITE
#?BEGIN_SITE
alias=***
ip=***
...
..
#?END_SITE


répété des centaines de fois.
j'aimerai avoir chaque bloque sur une seule ligne de type :

alias=**;ip=***;****;****;***

BEGIN_SITE et END_SITE étant les délimiteurs pour chaque nouvelle ligne. merci pour votre aide.

Configuration: Windows / Firefox 79.0

3 réponses

Messages postés
34985
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
3 juillet 2020
5 243
Salut,

Avec sed

$ cat f1
#?BEGIN_SITE
alias=***
ip=***
...
..
#?END_SITE
#?BEGIN_SITE
alias=***
ip=***
...
..
#?END_SITE


Solution 1 :

$ sed '/^#?BEGIN/{:z;N;/#?END_/!bz;s/\n/;/g}' f1 
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE


Solution 2 :

$ sed '/^#?BEGIN/{n;:z;N;/#?END_/!bz;s/\n/;/g;s/;#/\n#/}' f1 
#?BEGIN_SITE
alias=***;ip=***;...;..
?END_SITE
#?BEGIN_SITE
alias=***;ip=***;...;..
#?END_SITE


;-)

_______________________________ ☯ Zen my nuggets ☮ _____________________________
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot… ????
Messages postés
18148
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
3 juillet 2020
4 887
hello
sur Solaris, utiliser nawk
$ nawk '/END/ {c=RS} /BEGIN|END/ {print c $0; c=""; next} {printf $0 ";"}' fichier
#?BEGIN_SITE
alias=***;ip=***;...;..;
#?END_SITE
#?BEGIN_SITE
alias=***;ip=***;...;..;
#?END_SITE
$
$ nawk '{printf $0 ";"} /END/ {print ""}' fichier
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE;
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE;
Messages postés
18148
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
3 juillet 2020
4 887
sans ; en fin de ligne
$ nawk '{c=";"} /END/ {c=RS} {printf $0 c}' fichier
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
>
Messages postés
18148
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
3 juillet 2020

merci beaucoup ça fonctionne, j'aimerai supprimer #?BEGIN_SITE et #?END_SITE j ai pensé untiliser ta première commande et utiliser grep -v mais si on peut faire ça sur une seule ligne c'est plus propre avec nawk.

j'aimerai avoir également une premiére ligne de ce type:
alias;ip; ***** correspondant à chaque ligne avant le =
et ensuite toutes les lignes avec les résultats correspondant à ce qui se trouve aprés le =

je voulais utiliser un pipe et remettre un awk derriére mais il y a peut être possibilité de tout faire sur la même commande ?

ça donnerait :
alias;ip;port;***;
vh-gr00;10.198.87.12;2343;*****
vh-gr02;10.198.78.13;2453;****
Messages postés
18148
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
3 juillet 2020
4 887 > dofre114
montre un exemple de données
Merci beaucoup , j'avais pas creuser sed , j'ai juste un petit problème, je n'avais pas précisé je suis sur solaris j'ai un label too long lorsque je lance la commande, je suis entrain de chercher apparemment il faut découper le sed.
Messages postés
34985
Date d'inscription
dimanche 7 novembre 2010
Statut
Non membre
Dernière intervention
3 juillet 2020
5 243
Dans un premier temps, essaies de mettre la syntaxe dans un script qu'on appellera depuis la commande.

1 - script.sed :
$ cat script.sed 
/^#?BEGIN/ {
n
:z
N
/#?END_/ !b z
s/\n/;/g
s/;#/\n#/
}


Exécution :
$ sed -f script.sed f1
#?BEGIN_SITE
alias=***;ip=***;...;..
#?END_SITE
#?BEGIN_SITE
alias=***;ip=***;...;..
#?END_SITE


2 - script_2.sed :
$ cat script_2.sed 
/^#?BEGIN/ {
:z
N
/#?END_/ !b z
s/\n/;/g
}


Exécution :
$ sed -f script_2.sed f1
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE
#?BEGIN_SITE;alias=***;ip=***;...;..;#?END_SITE


Si ça ne marche pas, on essaiera d'autre(s) solution(s)…