La forma más idiomática de hacerlo awk
es la siguiente:
awk 'ORS=NR%2?FS:RS' file
Produce:
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 explicarlo, necesitamos definir cada una de las variables integradas:
RS
separador de registros El valor predeterminado es \n
(nueva línea).
ORS
separador de registro de salida. El valor predeterminado es \n
(nueva línea).
FS
separador de campo El valor predeterminado es
(espacio).
NR
Número de registro.
Como el separador de registros predeterminado es la nueva línea, un registro es, por defecto, una línea.
NR%2
es el módulo de NR/2
, por lo que será 0
o 1
. 0
para líneas pares y 1
para líneas impares.
var=condition?condition_if_true:condition_if_false
es el operador ternario.
Todos juntos, diciendo ORS=NR%2?FS:RS
que estamos definiendo el separador de registro de salida:
- si el número de registros está en el formulario
2k + 1
, es decir, en líneas pares, entonces los separadores de registros de salida se establecen en FS
, es decir, un espacio.
- si el número de registro está en el formulario
2k
, es decir, en líneas impares, entonces los separadores de registros de salida se establecen en RS
, es decir, una nueva línea.
De esta manera, las líneas impares terminan con un espacio, que luego se une con la siguiente línea. Después de esa línea, se imprime una nueva línea.
Más información en Idiomatic awk .
tr
está completamente basado en caracteres: solicitó a tr que elimine las nuevas líneas y todas las 'G', 'r', 'o', 'u' y 'p'.