【问题标题】:Add Double Quotes Around Output Field在输出字段周围添加双引号
【发布时间】:2018-02-05 11:20:39
【问题描述】:

我正在尝试用双引号将awk 输出字段括起来,但是一直遇到错误。此代码在 Ubuntu 系统上的 bash 脚本中运行

错误

awk: cmd. line:1: BEGIN {print "<table id="\"alert\"",">"} ; {  print "<tr><td class="\"site\"",">" $1 "</td><td class="\"fdate\"",">" $2 "</td><td class="\"prcp\"",">" $3 "</td><td class="\"snow\"",">" $4 "</td><td class="\"tmp2m\"",">" $5 "</td><td class="\"dpt2m\"",">" $6 "</td><td class="\"wchill\"",">" $7 "</td><td class="\"wind10m\"",">" $8 "</td></tr>"} ; END { print "</table>"}
awk: cmd. line:1:                          ^ backslash not last character on line
awk: cmd. line:1: BEGIN {print "<table id="\"alert\"",">"} ; {  print "<tr><td class="\"site\"",">" $1 "</td><td class="\"fdate\"",">" $2 "</td><td class="\"prcp\"",">" $3 "</td><td class="\"snow\"",">" $4 "</td><td class="\"tmp2m\"",">" $5 "</td><td class="\"dpt2m\"",">" $6 "</td><td class="\"wchill\"",">" $7 "</td><td class="\"wind10m\"",">" $8 "</td></tr>"} ; END { print "</table>"}
awk: cmd. line:1:                          ^ syntax error

尝试的代码

awk -F, 'BEGIN {print "<table id="\"alert\"",">"} ; {  print "<tr><td class="\"site\"",">" $1 "</td><td class="\"fdate\"",">" $2 "</td><td class="\"prcp\"",">" $3 "</td><td class="\"snow\"",">" $4 "</td><td class="\"tmp2m\"",">" $5 "</td><td class="\"dpt2m\"",">" $6 "</td><td class="\"wchill\"",">" $7 "</td><td class="\"wind10m\"",">" $8 "</td></tr>"} ; END { print "</table>"}' /home/weather/csv > /home/weather/csv.html

【问题讨论】:

  • 建议添加示例输入/输出以便清晰和测试...另外,您可以使用 html 解析器/模块...

标签: linux awk


【解决方案1】:

您的引号太多,您可能不想用逗号分隔要打印的各个项目:

$ awk -F, 'BEGIN {print "<table id=\"alert\"" ">"}'
<table id="alert">

有时将双引号设置为变量有助于提高可读性:

$ awk -F, -v q='"' 'BEGIN {print "<table id=" q "alert" q ">"}'
<table id="alert">

【讨论】:

  • 这太好了,谢谢!我正在使用此代码将 CSV 文件转换为 HTML 代码,因此,我需要打印八个变量中的每一个
  • 是的,我明白了。遵循这种模式应该可以让您到达那里,但如果您仍然有完整的 awk 错误,请返回另一条评论。
  • 最终代码:awk -F, 'BEGIN {print "&lt;table id=\"alert\"" "&gt;"} ; {print "&lt;tr&gt;&lt;td class=\"site\"" "&gt;" $1 "&lt;/td&gt;&lt;td class=\"fdate\"" "&gt;" $2 "&lt;/td&gt;&lt;td class=\"prcp\"" "&gt;" $3 "&lt;/td&gt;&lt;td class=\"snow\"" "&gt;" $4 "&lt;/td&gt;&lt;td class=\"tmp2m\"" "&gt;" $5 "&lt;/td&gt;&lt;td class=\"dpt2m\"" "&gt;" $6 "&lt;/td&gt;&lt;td class=\"wchill\"" "&gt;" $7 "&lt;/td&gt;&lt;td class=\"wind10m\"" "&gt;" $8 "&lt;/td&gt;&lt;/tr&gt;"} ; END { print "&lt;/table&gt;"}' /home/weather/csv &gt; /home/weather/csv.html
  • @ampry 花点时间想想你在做什么,因为你似乎只是在问题上引用尽可能多的引号。例如,当您需要"&lt;/td&gt;&lt;td class=\"site\"&gt;" 时,您拥有"&lt;/td&gt;&lt;td class=\"site\"" "&gt;",而实际上您应该只使用printf "&lt;td class=\"site\"&gt;%s&lt;/td&gt;", $1 之类的printfs 而不是print "&lt;tr&gt;&lt;td class=\"site\"" "&gt;" $1 "&lt;/td&gt;",而且还有更简单的方法来完成这项工作。
【解决方案2】:

以下是你真正应该如何处理这个问题(未经测试):

awk -F, '
BEGIN {
    split("site,fdate,prcp,snow,tmp2m,dpt2m,wchill,wind10m",tags)
    print "<table id=\"alert\">"
}
{
    printf "<tr>"
    for (i=1; i in tags; i++) {
        printf "<td class=\"%s\">%s</td>", tags[i], $i
    }
    print "</tr>"
}
END { print "</table>"}
' /home/weather/csv

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多