AWK将CSV转换为HTML表格

AWK将CSV转换为HTML表格,html,linux,csv,awk,Html,Linux,Csv,Awk,只是在linux中胡闹,涉足AWK。如何将CSV格式的文件更改为HTML格式的文件。例如这是我加载到shell中的信息 user$ cat table.csv Ep#,Featured Film,Air date 211,First Spaceship on Venus,12/29/90 310,Fugitive Alien,08/17/91 424,Manos: The Hands of Fate,01/30/93 然后在运行代码之后,这就是应该输出的内容 user$ csv2html.aw

只是在linux中胡闹,涉足AWK。如何将CSV格式的文件更改为HTML格式的文件。例如这是我加载到shell中的信息

user$ cat table.csv
Ep#,Featured Film,Air date
211,First Spaceship on Venus,12/29/90
310,Fugitive Alien,08/17/91
424,Manos: The Hands of Fate,01/30/93
然后在运行代码之后,这就是应该输出的内容

user$ csv2html.awk table.csv
<html><body><table>
<tr>
<th>Ep#</th>
<th>Featured Film</th>
<th>Air date</th>
</tr>
<tr>
<td>211</td>
<td>First Spaceship on Venus</td>
<td>12/29/90</td>
</tr>
<tr>
<td>310</td>
<td>Fugitive Alien</td>
<td>08/17/91</td>
</tr>
<tr>
<td>424</td>
<td>Manos: The Hands of Fate</td>
<td>01/30/93</td>
</tr>
</table></body></html>
user$csv2html.awk table.csv
Ep#
特色电影
航空日期
211
金星上的第一艘宇宙飞船
12/29/90
310
逃犯
08/17/91
424
马诺斯:命运之手
01/30/93
我已经尝试了一些类似的方法,但是我有一些比较复杂的错误

#!/bin/awk
print "<tr>
for( i = 1; i <= NF; i++)
     print "<td> "$i" </td"
#print "</tr>"
#/垃圾箱/垃圾桶
“打印”

对于(i=1;i在AWK中有很多方法可以做到这一点,但我更喜欢下面的代码。我已经在代码中添加了一些解释作为注释。希望这能有所帮助

要在CLI上运行,请将代码保存在“csv_To_html.awk”等文件中,并以“table.csv”作为参数执行:

$ chmod +x csv_to_html.awk
$ ./csv_to_html.awk table.csv > table.html
代码:

#!/bin/awk -f

# Set field separator as comma for csv and print the HTML header line
BEGIN {
    FS=",";
    print "<html><body><table>"
}
# Function to print a row with one argument to handle either a 'th' tag or 'td' tag
function printRow(tag) {
    print "<tr>";
    for(i=1; i<=NF; i++) print "<"tag">"$i"</"tag">";
    print "</tr>"
}
# If CSV file line number (NR variable) is 1, call printRow fucntion with 'th' as argument
NR==1 {
    printRow("th")
}
# If CSV file line number (NR variable) is greater than 1, call printRow fucntion with 'td' as argument
NR>1 {
    printRow("td")
}
# Print HTML footer
END {
    print "</table></body></html>"
}
!/bin/awk-f
#将字段分隔符设置为csv的逗号,并打印HTML标题行
开始{
FS=“,”;
打印“”
}
#函数打印一行,其中一个参数用于处理“th”标记或“td”标记
函数printRow(标记){
打印“”;
对于(i=1;i1{
printRow(“td”)
}
#打印HTML页脚
结束{
打印“”
}

另一个类似的
awk

    BEGIN{header = "<html><body><table>"; print header}
         {c = NR == 1 ? "th" : "td";
          OFS = et(c) bt(c);
          $1 = $1;
          print wrap("tr", wrap(c,$0)) }
      END{gsub("<","</",header); print header }

    function wrap(t, v) { return bt(t) v et(t)}
    function bt(t) {return "<" t ">"}
    function et(t) {return "</" t ">"}
BEGIN{header=”“;print header}
{c=NR==1?“th”:“td”;
OFS=et(c)bt(c);
$1 = $1;
打印包装(“tr”,包装(c,$0))}

结束{gsub(“欢迎来到Stack Overflow!很好,你的问题中包含了一个输入和输出的小例子。如果这个问题还显示了你迄今为止的尝试,也就是说,如果你展示了你的研究成果,那就更好了。@RJHunter更新了这是一个非常神秘的问题。看起来它实际上可能非常优雅,但是你对terna的使用ry运算符以及相等比较和赋值都在同一行中,这意味着即使是高级Awk用户也必须查阅文档,以确保该行的解析方式准确无误。也许在相等测试周围添加括号?不确定还有什么难以理解的。这并不正确(我有时会这样做)但是写得很简洁。