Il modo più idiomatico per farlo awk
è il seguente:
awk 'ORS=NR%2?FS:RS' file
Emette:
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
Per spiegarlo, dobbiamo definire ciascuna delle variabili incorporate:
RS
separatore di record. L'impostazione predefinita è \n
(nuova riga).
ORS
separatore record di uscita. L'impostazione predefinita è \n
(nuova riga).
FS
separatore di campo. Il valore predefinito è
(spazio).
NR
numero di record.
Poiché il separatore di record predefinito è la nuova riga, un record è, come impostazione predefinita, una riga.
NR%2
è il modulo di NR/2
, in modo che sia o 0
o 1
. 0
per linee pari e 1
per linee dispari.
var=condition?condition_if_true:condition_if_false
è l'operatore ternario.
Tutti insieme, dicendo ORS=NR%2?FS:RS
che stiamo definendo il separatore del record di output:
- se il numero di record è nel modulo
2k + 1
, ovvero su linee pari, i separatori del record di output sono impostati su FS
uno spazio.
- se il numero di record si trova sul modulo
2k
, ovvero su righe dispari, i separatori di record di output vengono impostati su RS
una nuova riga.
In questo modo, le linee dispari terminano con uno spazio, che viene quindi unito alla linea successiva. Dopo quella linea, viene stampata una nuova linea.
Maggiori informazioni in Idiomatic awk .
tr
è interamente basato sui caratteri: hai chiesto a tr di rimuovere le nuove righe e tutte le "G", "r", "o", "u" e "p".