awk创建html表在每个数据条目的末尾添加空格

时间:2017-06-07 13:28:55

标签: html awk

我正在使用下面的代码从输入文件创建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>

2 个答案:

答案 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>