A maneira mais idiomática de fazer isso awk
é a seguinte:
awk 'ORS=NR%2?FS:RS' file
Emite:
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
Para explicá-lo, precisamos definir cada uma das variáveis internas:
RS
separador de registros. O padrão é \n
(nova linha).
ORS
separador de registros de saída. O padrão é \n
(nova linha).
FS
separador de campo. O padrão é
(espaço).
NR
número de registro.
Como o separador de registros padrão é a nova linha, um registro é, como padrão, uma linha.
NR%2
é o módulo de NR/2
, de modo que será ou 0
ou 1
. 0
para linhas 1
pares e linhas ímpares.
var=condition?condition_if_true:condition_if_false
é o operador ternário.
Todos juntos, dizendo ORS=NR%2?FS:RS
que estamos definindo o separador de registros de saída:
- se o número de registros estiver no formulário
2k + 1
, ou seja, em linhas pares, os separadores de registros de saída serão configurados para FS
, ou seja, um espaço.
- se o número de registros estiver no formulário
2k
, ou seja, em linhas ímpares, os separadores de registros de saída serão configurados para RS
, ou seja, uma nova linha.
Dessa forma, as linhas ímpares terminam com um espaço, que é então unido à próxima linha. Após essa linha, uma nova linha é impressa.
Mais informações no Idiomatic awk .
tr
é inteiramente baseado em caracteres: você pediu a tr para remover novas linhas e todos os 'G', 'r', 'o', 'u' e 'p'.