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