Estou tentando converter o formato de dados delimitado para saída de tabela de colunas HTML para impressão por e-mail e não tenho certeza de como usar o delimitador de barra vertical como separador para formatação tabular HTML.
Abaixo está o que eu poderia usar se um espaço fosse um separador, mas neste exemplo estou usando um pipeline (|).
awk ' BEGIN {
print "To: '[email protected]'"
#print "MIME-Version: 1.0"
print "Content-Type: text/html"
print "Subject: This is a test email"
print "<html><body><table border=1 cellspacing=0 cellpadding=3>"
print "<tr>"
print "<td>SID</td>";
print "<td>PID</td>";
print "<td>Username</td>";
print "<td>Database</td>";
print "<td>Hostname</td>";
print "<td>Program</td>";
print "<td>Connected</td>";
print "<td>Idle Time</td>";
print "<td>Query Time</td>";
print "<td>EST COST</td>";
print "<td>SEQ SCAN</td>";
print "<td>Query</td>";
print "</tr>"
} {
print "<tr>"
print "<td>"$1"</td>";
print "<td>"$2"</td>";
print "<td>"$3"</td>";
print "<td>"$4"</td>";
print "<td>"$5"</td>";
print "<td>"$6"</td>";
print "<td>"$7"</td>";
print "<td>"$8"</td>";
print "<td>"$9"</td>";
print "<td>"$10"</td>";
print "<td>"$11"</td>";
print "<td>"$12"</td>";
print "</tr>"
} END {
print "</table></body></html>"
} ' /home/test/test.unl | sendmail -t
Dentro do arquivo test.unl está o seguinte:
15422216|-1|dwhvo|test|pd244zax.test.corp|N/A| 10:56:53| -0:00:30|10:57:22|1045127|1|SELECT sba_sub_aux.sba_subscriber_id, sba_sub_aux.sba_id_number, sba_sub_aux.sba_matchcode, sba_sub_aux.sba_marketing, sba_su|
Gostaria de obter o seguinte em formato de tabela por e-mail.
Se você remover o final
|
e adicionar um cabeçalho:Então, isso se torna um TSV simples com pipe como delimitador, e você pode usar, por exemplo,
mlr
para converter para um CSV adequado, quepandoc
pode ser convertido para HTML:Isso cuidará do escape adequado do HTML no conteúdo das células.
Para alinhar à direita algumas colunas, como na saída esperada, outra opção é usar markdown como formato intermediário.
Acima, use
perl
para especificar o alinhamento de cada coluna com base no110000101110
"mapa de bits" (1 para direita, 0 para esquerda).Cuidado
mlr
para não escapar dos operadores de sintaxe markdown nas células da tabela. Então, por exemplo, se você tiver`foo`
ou**bar**
em algumas das células, elas serão convertidas porpandoc
para o equivalente HTML (<code>foo</code>
,<strong>bar</strong>
).Se
pandoc
for difícil instalar no seu sistema, você pode fazer tudo emperl
(que deve ser pré-instalado), e os módulosHTML::Table
eHTML::Entities
que, se ainda não estiverem instalados, devem ser fáceis de instalar, mesmo que não estejam empacotados no seu sistema (como usandocpan
):O Perl também possui módulos para formatar e enviar e-mails corretamente.
Como @GillesQuénot comentou, dividir uma linha
|
com awk é tão simples quantoawk -F '|'
.Dito isso, recomendo que você defina duas funções: uma para escapar do texto HTML (os dados de exemplo que você mostrou não precisam disso, mas nunca se sabe...) e outra para imprimir uma linha inteira da tabela HTML; isso deixará o programa "mais limpo" e robusto.
awk -F '|'
funciona para mim.Saída exibida como eu queria no e-mail.
A resposta de @Fravadona é boa, aqui vai apenas uma abordagem alternativa, usando qualquer awk POSIX, para considerar que, na minha opinião, não é significativamente melhor, além de algumas diferenças cosméticas/sinos e assobios. Ela basicamente isola cada parte específica da saída, fornecendo uma função separada para cada nível/segmento de HTML, o que pode torná-la um pouco mais fácil e menos propensa a erros para modificar, se necessário, no futuro: