Наиболее идиоматический способ сделать это awk
заключается в следующем:
awk 'ORS=NR%2?FS:RS' file
Это выводит:
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
Чтобы объяснить это, нам нужно определить каждую из встроенных переменных:
RS
разделитель записей. По умолчанию \n
(новая строка).
ORS
разделитель выходной записи. По умолчанию \n
(новая строка).
FS
разделитель полей. По умолчанию
(пробел).
NR
номер записи.
Поскольку разделителем записей по умолчанию является новая строка, запись по умолчанию является строкой.
NR%2
является модулем NR/2
, так что это будет либо 0
или 1
. 0
для четных и 1
нечетных линий.
var=condition?condition_if_true:condition_if_false
является троичным оператором.
Все вместе говорят, что ORS=NR%2?FS:RS
мы определяем разделитель выходной записи:
- если номер записи указан в форме
2k + 1
, то есть в четных строках, то в качестве разделителей выходной записи устанавливается FS
пробел.
- если номер записи указан в форме
2k
, то есть в нечетных строках, то в качестве разделителей выходных записей устанавливается RS
новая строка.
Таким образом, нечетные строки заканчиваются пробелом, который затем соединяется со следующей строкой. После этой строки печатается новая строка.
Больше информации в Idiomatic awk .
tr
полностью на основе символов: вы попросили tr удалить символы новой строки и все 'G', 'r', 'o', 'u' и 'p'.