La manière la plus idiomatique de le faire awk
est la suivante:
awk 'ORS=NR%2?FS:RS' file
Il produit:
Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active
Pour l'expliquer, nous devons définir chacune des variables intégrées:
RS
séparateur d'enregistrement. La valeur par défaut est \n
(nouvelle ligne).
ORS
séparateur d'enregistrement de sortie. La valeur par défaut est \n
(nouvelle ligne).
FS
séparateur de champ. La valeur par défaut est
(espace).
NR
numéro d'enregistrement.
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 module de NR/2
, de sorte qu'il 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.
Tous ensemble, en disant que ORS=NR%2?FS:RS
nous définissons le séparateur d'enregistrement de sortie:
- si le nombre d'enregistrements est sur le formulaire
2k + 1
, c'est-à-dire sur des lignes paires, les séparateurs d'enregistrement en sortie sont définis sur FS
, c'est-à-dire un espace.
- si le numéro d'enregistrement est sur le formulaire
2k
, c'est-à-dire sur les lignes impaires, les séparateurs d'enregistrement en sortie sont définis sur RS
, c'est-à-dire une nouvelle ligne.
De cette façon, 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'infos dans awk idiomatique .
tr
est entièrement basé sur les caractères: vous avez demandé à tr de supprimer les nouvelles lignes et tous les 'G', 'r', 'o', 'u' et 'p'.