我正在使用下面的代码从输入文件创建html表,它完美地运行,但是在创建html表时,它为单元格的每个条目添加了一个空格。我如何避免在最后获得空间?
awk 'BEGIN{print "<tr>";print "<th>NAME</th>";print "<th>POLICY</th>";print "<th>STATUS</th>"} {print "<tr>";for(i=1;i<=NF;i++)print "<td>" $i"</td>";print "</tr>"} END{print "</table>"}' /tmp/output/Report_$(date -d '-1 day' '+%d-%b-%Y') >> /tmp/output/Report_$(date -d '-1 day' '+%d-%b-%Y').html]
现在输入文件中的条目将通过脚本echo "$x $y $z" >> /tmp/output/Report_$(date -d '-1 day' '+%d-%b-%Y')
让我知道如何在每个数据输入到单元格的末尾避免使用空格。
输入文件
cat /tmp/t
Cindy Today Standard
Victor Today Standard
Bob Today Standard
Martha Tomorrow Oracle
Sam Tomorrow Oracle
我的代码问题是,<tr></tr>
和<td></td>
每次都有一个新行,这为最终的工作表单元添加了额外的不必要空间&gt;
在输出之前: 谢谢@karakfa,它做了诀窍,我的代码中的问题是每个都有新行,这意味着它将在实际数据中添加一个空格。
简单地说,之前和之后的最终输出的差异是 之前:
</tr>
<tr>
<td>data1</td>
<td>data2</td>
<td>data3</td>
</tr>
<tr>
<td>data1</td>
<td>data2</td>
<td>data3</td>
</tr>
后:
<tr><td>data1</td><td>data2</td><td>data3</td></tr>
<tr><td>data1</td><td>data2</td><td>data3</td></tr>
答案 0 :(得分:2)
你的问题没有包含足够的信息来复制你所遇到的问题,所以我们现在能做的最好的事情就是猜测,并提出更好的方法去做你拥有的东西包括在内。
使用printf格式构建输出怎么样?使用格式化可以更精确地控制输出。
awk '
BEGIN {
printf "<table>\n"
printf "<tr>\n <th>NAME</th> <th>POLICY</th> <th>STATUS</th>\n</tr>"
fmtrow="<tr>\n%s</tr>"
fmttd="\t<td>%s</td>\n"
}
{
data=""
for (i=1; i<=NF; i++) data=data sprintf(fmttd, $i)
printf fmtrow, data
}
END {
printf "\n</table>\n"
}
'
这实现了与原始脚本相同的功能,for循环逐步遍历列以构建每一行。如果你知道你只有三列,你可以简化:
awk '
BEGIN {
printf "<table>\n"
printf "<tr>\n\t<th>NAME</th>\n\t<th>POLICY</th>\n\t<th>STATUS</th>\n</tr>"
fmtrow="<tr>\n\t<td>%s</td>\n\t<td>%s</td>\n\t<td>%s</td>\n</tr>"
}
{
printf fmtrow, $1, $2, $3
}
END {
printf "\n</table>\n"
}
'
请记住,这只是回收您的输入,它不会清理它。如果源数据文件已在Microsoft Windows计算机上编辑,则可能在每行的末尾添加了Ctrl-M字符,而awk只会将其视为最后一个字段的一部分。
答案 1 :(得分:2)
效率不高但是使用辅助函数生成html表的更简洁方法
awk 'function wrap(tag,x) {return "<"tag">"x"</"tag">"}
function table(x) {return wrap("table",ORS x)}
function row(x) {return wrap("tr",x) ORS}
function cell(x) {return wrap("td",x)}
BEGIN {print table(row(cell(1) cell(2) cell(3)))}'
<table>
<tr><td>1</td><td>2</td><td>3</td></tr>
</table>
使用非静态数据,也许这样更好
$ awk 'function wrap(tag,x) {return "<"tag">"x"</"tag">"}
function row(x) {return wrap("tr",x)}
function cell(x) {return wrap("td",x)}
BEGIN {print "<table>"}
{print row(cell($1) cell($2) cell($3))}
END {print "</table>"}' <(echo -e "1 2 3\n4 5 6\n7 8 9")
<table>
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td><td>6</td></tr>
<tr><td>7</td><td>8</td><td>9</td></tr>
</table>