La manière la plus idiomatique de le faire en awk
est la suivante :
awk 'ORS=NR%2?FS:RS' fichier
Cela donne en sortie :
Nom d'exécution : vmhba2:C0:T3:L14 État du groupe : actif
Nom d'exécution : vmhba3:C0:T0:L14 État du groupe : actif non optimisé
Nom d'exécution : vmhba2:C0:T1:L14 État du groupe : actif non optimisé
Nom d'exécution : vmhba3:C0:T3:L14 État du groupe : actif
Nom d'exécution : vmhba2:C0:T2:L14 État du groupe : actif
Pour l'expliquer, nous devons définir chacune des variables intégrées :
RS
séparateur d'enregistrements. Par défaut \n
(nouvelle ligne).
ORS
séparateur de sortie d'enregistrements. Par défaut \n
(nouvelle ligne).
FS
séparateur de champs. Par défaut un espace.
NR
nombre d'enregistrements.
Comme le séparateur d'enregistrement par défaut est la nouvelle ligne, un enregistrement est, par défaut, une ligne.
NR%2
est le modulo de NR/2
, donc cela sera soit 0
ou 1
. 0
pour les lignes paires et 1
pour les lignes impaires.
var=condition?condition_if_true:condition_if_false
est l'opérateur ternaire.
Ainsi, en disant ORS=NR%2?FS:RS
, nous définissons le séparateur de sortie d'enregistrements :
- si le nombre d'enregistrements est de la forme
2k + 1
, c'est-à-dire sur des lignes paires, alors le séparateur de sortie d'enregistrements est défini comme FS
, c'est-à-dire un espace.
- si le nombre d'enregistrements est de la forme
2k
, c'est-à-dire sur des lignes impaires, alors le séparateur de sortie d'enregistrements est défini comme RS
, c'est-à-dire une nouvelle ligne.
De cette manière, les lignes impaires se terminent par un espace, qui est ensuite joint à la ligne suivante. Après cette ligne, une nouvelle ligne est imprimée.
Plus d'informations dans Awk idiomatique.
3 votes
tr
est entièrement basé sur des caractères : vous avez demandé à tr de supprimer les sauts de ligne et tous les 'G', 'r', 'o', 'u' et 'p'.0 votes
Cherchez-vous toutes les autres (simples) nouvelles lignes à la fin d'une ligne, ou plusieurs nouvelles lignes comme
\n\n
, ou les deux ?