Найбільш ідіоматичний спосіб зробити це 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'.