Você pode alinhar as colunas sem usar o comando column
,
inteiramente dentro de awk
, fazendo
# fcinfo hba-port | awk '
BEGIN{man[-1]="HBA_Manufacturer"
ver[-1]="Firmware_Version"
sta[-1]="State"
man[0]="----------------"
ver[0]="----------------"
sta[0]="-----"
i=1
}
/Manufacturer:/ {man[i]=$2}
/Firmware Version:/ {ver[i]=$3}
/State:/ {sta[i]=$2; i++}
END {
maxlen1 = maxlen2 = maxlen3 = 0
for (j=-1; j<i; j++) {
if (length(man[j]) > maxlen1) maxlen1 = length(man[j])
if (length(ver[j]) > maxlen2) maxlen2 = length(ver[j])
if (length(sta[j]) > maxlen3) maxlen3 = length(sta[j])
}
for (j=-1; j<i; j++) {
printf("%-*s %-*s %-*s\n", maxlen1, man[j],
maxlen2, ver[j],
maxlen3, sta[j])
}
}'
Isto lê todo o texto de entrada, armazenando os dados (incluindo os cabeçalhos)
nos arrays man
, ver
e sta
(fabricante, versão e estado).
Os títulos das colunas são colocados nas entradas [-1]
e os traços
(que formam uma linha entre os títulos e os dados)
são colocados nas entradas [0]
;
estas se tornam as duas primeiras linhas da saída (veja abaixo).
Os dados reais começam em [1]
.
Quando chega ao fim dos dados, determina o tamanho máximo dos dados (incluindo os títulos) em cada coluna e, em seguida, imprime todos os dados (das matrizes), usando as larguras das colunas calculadas.
-
printf("%16s", "Emulex")
imprimeEmulex
(dez espaços em branco iniciais, seguidos pelo nome de seis caracteres, para um total de 16 caracteres). -
printf("%-16s", "Emulex")
(observe o-
) imprimeEmulex
(o nome de seis caracteres, seguido por dez espaços em branco à direita, para um total de 16 caracteres). -
printf("%-*s", 16, "Emulex")
faz o mesmo que %código%, exceto que recebe oprintf("%-16s", "Emulex")
da lista de argumentos em vez da string de formatação. -
Então, o acima irá produzir saída como
HBA_Manufacturer Firmware_Version State ---------------- ---------------- ----- Emulex 2.82a4 online Emulex 2.82a4 online Emulex 2.82a4 offline Emulex 2.82a4 offline Emulex 2.82a4 online Emulex 2.82a4 online
Se você quiser mais espaço entre as colunas, adicione espaços ao formato
16
. Por exemplo,printf
lhe daria algo mais próximo da saída do exemplo que você mostra. -
A saída do exemplo que você mostra apresenta uma linha contínua de traços depois dos cabeçalhos. Meu comando, como mostrado acima, dará apenas uma pequena linha de traços sob cada cabeçalho. Isso se torna ainda mais óbvio se alguns dos seus dados forem mais longos:
HBA_Manufacturer Firmware_Version State ---------------- ---------------- ----- Emulex 2.82a4 online Emulex 2.82a4 online Some_other_manufacturer 2.82a4 offline Emulex 2.82a4 offline Emulex 2.82a4 online Emulex 2.82a4 online
Isso pode ser corrigido, se necessário.
- Isso pode falhar se seus dados de entrada forem enormes,
porque
"%-*s %-*s %-*s\n"
pode ficar sem espaço para armazenar todos os dados. - Isso pode falhar com um erro de sintaxe
se você tiver uma versão mais antiga de
awk
(por exemplo, no Solaris). Se isso acontecer, tente colocar a instruçãoawk
em uma linha, comoprintf("%-*s %-*s %-*s\n", maxlen1, man[j], maxlen2, ver[j], maxlen3, sta[j])