我正在尝试将分隔数据格式转换为 html 列表输出以用于电子邮件打印,但我不确定如何使用管道分隔符作为 HTML 表格格式的分隔符。
如果使用空格作为分隔符,则可以使用以下选项,但在此示例中,我使用的是管道符 (|)。
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
test.unl 文件内容如下:
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|
我希望通过电子邮件以表格形式实现以下内容。
如果删除尾随的
|
, 并添加标题:然后,它就变成了一个以竖线为分隔符的简单 TSV,您可以使用它
mlr
来转换为适当的 CSV,然后pandoc
可以将其转换为 HTML:这将正确转义单元格内容中的 HTML。
为了按照预期输出右对齐某些列,另一个选项是使用 markdown 作为中间格式。
上面使用“位图”
perl
来指定每列的对齐方式110000101110
(1 为右,0 为左)。注意,
mlr
表格单元格中不会转义 Markdown 语法运算符。例如,如果您在某些单元格中有`foo`
或,它们将被转换为HTML 等效项 ( , )。**bar**
pandoc
<code>foo</code>
<strong>bar</strong>
如果
pandoc
在您的系统上安装很困难,您可以执行中的所有操作perl
(应该是预先安装的),并且HTML::Table
和HTML::Entities
模块(如果尚未安装)应该很容易安装,即使您的系统没有打包(例如通过使用cpan
):Perl 还具有用于正确格式化和发送电子邮件的模块。
正如@GillesQuénot 评论的那样,使用 awk 拆分一行
|
非常简单awk -F '|'
。也就是说,我建议您定义两个函数:一个用于转义 HTML 文本(您显示的示例数据不需要它,但您永远不知道......),另一个用于打印整个 HTML 表行;这将使程序“更清洁”和更健壮。
awk -F '|'
对我有用。输出按我想要的方式显示在电子邮件中。
@Fravadona 的回答很好,这只是一种替代方法,使用任何 POSIX awk,在我看来,除了一些外观差异/花哨的东西之外,并没有明显更好。它主要只是通过为每个级别/ HTML 段提供单独的函数来隔离输出的每个特定部分,这可能会使它更容易一些,并且如果将来需要修改的话,不容易出错: