Se andar duas vezes no arquivo não for um problema (grande) (armazenará apenas uma linha na memória):
awk -F : '{printf("%s\t ", $1)}' infile
echo
awk -F : '{printf("%s\t ", $2)}' infile
Qual, para uma contagem geral de campos seria (o que poderia ter muitos passeios do arquivo):
#!/bin/bash
rowcount=2
for (( i=1; i<=rowcount; i++ )); do
awk -v i="$i" -F : '{printf("%s\t ", $i)}' infile
echo
done
Mas, para uma transposição realmente geral, isso funcionará:
awk '$0!~/^$/{ i++;
split($0,arr,":");
for (j in arr) {
out[i,j]=arr[j];
if (maxr<j){ maxr=j} # max number of output rows.
}
}
END {
maxc=i # max number of output columns.
for (j=1; j<=maxr; j++) {
for (i=1; i<=maxc; i++) {
printf( "%s\t", out[i,j]) # out field separator.
}
printf( "%s\n","" )
}
}' infile
E para torná-lo bonito (usando a tabulação \t
como separador de campos):
./script | |column -t -s $'\t'
Virtual_Machine ID Status Memory Uptime Server Pool HA VCPU Type OS
OL6U7 0004fb00000600003da8ce6948c441bd Running 65536 17103 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
O código acima para uma transposição geral armazenará a matriz inteira na memória.
Isso pode ser um problema para arquivos realmente grandes.
Atualização para novo texto.
Para processar o novo texto postado na pergunta, parece-me que duas passagens do awk são a melhor resposta. Uma passagem, tão curta quanto os campos, imprimirá os títulos dos campos de cabeçalho. A próxima passagem awk irá imprimir único campo 2. Em ambos os casos, eu adicionei uma maneira de remover esquerda e à direita espaços (para melhor formatação).
#!/bin/bash
{
awk -F: 'BEGIN{ sl="Virtual Machine"}
$1~sl && head == 1 { head=0; exit 0}
$1~sl && head == 0 { head=1; }
head == 1 {
gsub(/^[ \t]+/,"",$1); # remove leading spaces
gsub(/[ \t]+$/,"",$1); # remove trailing spaces
printf( "%s\t", $1)
}
' infile
#echo
awk -F: 'BEGIN { sl="Virtual Machine"}
$1~sl { printf( "%s\n", "") }
{
gsub(/^[ \t]+/,"",$2); # remove leading spaces
gsub(/[ \t]+$/,"",$2); # remove trailing spaces
printf( "%s\t", $2)
}
' infile
echo
} | column -t -s "$(printf '%b' '\t')"
O { ... } | column -t -s "$(printf '%b' '\t')"
ao redor é formatar a tabela inteira de maneira bonita.
Por favor, note que o "$(printf '%b' '\t')"
poderiam ser substituídos por $'\t'
no ksh, bash, ou zsh.