在Bash中将带有标题的csv转换为HTML

在Bash中将带有标题的csv转换为HTML,bash,awk,Bash,Awk,我在csv文件中有如下数据 ServerName,Index,Status 10.xxx.xx.xx,1.5.1.1,2 10.xxx.xx.xx,1.5.1.2,3 我需要将此数据转换为html,如果“Status”的值为3/4/5,还需要为行着色。。 请帮我做这件事。 在下面试用 awk 'BEGIN{ FS="," print "<HTML>""<TABLE border="1"><TH>JOB_NAME</TH><TH&g

我在csv文件中有如下数据

ServerName,Index,Status
10.xxx.xx.xx,1.5.1.1,2
10.xxx.xx.xx,1.5.1.2,3
我需要将此数据转换为html,如果“Status”的值为3/4/5,还需要为行着色。。 请帮我做这件事。 在下面试用

    awk 'BEGIN{
FS=","
print  "<HTML>""<TABLE border="1"><TH>JOB_NAME</TH><TH>RUN_DATE</TH><TH>STATUS</TH>"
}
 {
printf "<TR>"
for(i=1;i<=NF;i++)
printf "<TD>%s</TD>", $i
print "</TR>"
 }
END{
print "</TABLE></BODY></HTML>"
 }
' 10.106.40.45_FinalData.csv > file.html
sed -i "s/2/<font color="green">2<\/font>/g;s/4/<font color="red">4<\/font>/g;s/5/<font color="red">5<\/font>/g;" file.html
awk'开始{
FS=“,”
打印“”“作业\u名称运行\u日期状态”
}
{
printf“”

对于(i=1;i你实际上并没有说问题出在哪里,但我认为当数字出现在地址中时,它也会使数字着色

最好的解决方案可能是在awk脚本中添加一个条件(未测试):

if(i==3&&$i==2){
打印“2”
}否则。。。。。
或者,您的状态字段是列中唯一的数字,而地址不是,因此您可以调整模式匹配:

"s/>2</><font color="green">2<\/font></g;......"
“s/>22
$cat tst.awk
开始{
FS=“,”
颜色[3]=“红色”
颜色[4]=“绿色”
颜色[5]=“蓝色”
打印“”
打印“”
打印“作业\名称运行\日期状态”
}
NR>1{
printf“”

对于(i=1;问题是ServerName和Index中也有数字。因此,如果我提到2/3/4/5,它会为所有单元格/字体着色。位我需要将此颜色仅应用于状态列您的代码假设CSV值不包含换行符,CSV规范允许什么,这是一个疏忽吗?@Ferrybig否,它正在解决问题OP a实际上,我们没有试图为所有可能的CSV样式和所有可能的输入值提供通用解决方案(没有一个“CSV规范”,通常CSV字段也可以包含逗号和HTML标记,对吗?)。有关使用awk处理CSV的更多信息,请参阅。
"s/>2</><font color="green">2<\/font></g;......"
$ cat tst.awk
BEGIN{
    FS = ","
    colors[3] = "red"
    colors[4] = "green"
    colors[5] = "blue"

    print "<HTML><BODY>"
    print "<TABLE border=\"1\">"
    print "<TR><TH>JOB_NAME</TH><TH>RUN_DATE</TH><TH>STATUS</TH></TR>"
}
NR>1 {
    printf "<TR>"
    for (i=1; i<=NF; i++) {
        if ( (i == NF) && ($i in colors) ) {
            on  = "<font color=\"" colors[$i] "\">"
            off = "</font>"
        }
        else {
            on = off = ""
        }
        printf "<TD>%s%s%s</TD>", on, $i, off
    }
    print "</TR>"
}
END {
    print "</TABLE>"
    print "</BODY></HTML>"
}
$ awk -f tst.awk file
<HTML><BODY>
<TABLE border="1">
<TR><TH>JOB_NAME</TH><TH>RUN_DATE</TH><TH>STATUS</TH></TR>
<TR><TD>10.xxx.xx.xx</TD><TD>1.5.1.1</TD><TD>2</TD></TR>
<TR><TD>10.xxx.xx.xx</TD><TD>1.5.1.2</TD><TD><font color="red">3</font></TD></TR>
</TABLE>
</BODY></HTML>