Html awk中的gsub函数,用于在unix中为字符着色?

Html awk中的gsub函数,用于在unix中为字符着色?,html,shell,unix,awk,gsub,Html,Shell,Unix,Awk,Gsub,我有一个生成output.txt文件的脚本。在该脚本中有4列,如下所示 Filename Date Space status xyz.txt Nov18 3.8M On_time mnp.txt Nov11 8.7M Delayed pqr.csv Nov16 9.0M No_records 我通过自动邮件发送输出文件,我想添加状态字段的颜色,如(如果状态延迟,则红色、On_time、绿色和No_records,然后分别为黄色) 首先,我将output.txt文件转换为output.ht

我有一个生成output.txt文件的脚本。在该脚本中有4列,如下所示

Filename Date Space status
xyz.txt Nov18 3.8M  On_time
mnp.txt Nov11 8.7M  Delayed
pqr.csv Nov16 9.0M  No_records
我通过自动邮件发送输出文件,我想添加状态字段的颜色,如(如果状态延迟,则红色、On_time、绿色和No_records,然后分别为黄色)

首先,我将output.txt文件转换为output.html,这非常完美,我可以更改背景和文本颜色,但无法更改延迟、On_时间和n0_记录的颜色。请找到下面的代码

awk 'BEGIN { print "<html>"
print "<head>"
print "</head>"
print "<body bgcolor=\"#00ffff\" text=\"#0000FF\">"
print "<pre>"
}
{
gsub(/Fund name/,"<b>Fund name</b>")
gsub(/1234/,"<b>1234</b>")
print $0
}
END{ print "</pre>"
print "</body>"
print "</html>"
}
' ${PATH1}/output.txt > ${PATH1}/output.html
#  Send mail (uses SENDMAIL)
(
echo "From: Me <me@somewhere>"
echo "To: You <MPAYAL@StateStreet.com>"
echo "Cc: Someone Else <someoneo@somewhere>"
echo "Subject: Message Title"
echo "MIME-Version: 1.0"
echo "Content-Type: text/html"
echo "Content-Disposition: inline"
echo
echo "<pre>Any text here</pre>"
echo
cat ${PATH1}/output.html
echo
) | /usr/sbin/sendmail "$EMAILTO"
awk'开始{打印“”
打印“”
打印“”
打印“”
打印“”
}
{
gsub(/基金名称/,“基金名称”)
gsub(/1234/,“1234”)
打印$0
}
结束{打印“”
打印“”
打印“”
}
'${PATH1}/output.txt>${PATH1}/output.html
#发送邮件(使用SENDMAIL)
(
回声“来自:我”
回音“致:你”
回音“抄送:其他人”
echo“主题:消息标题”
echo“MIME版本:1.0”
echo“内容类型:文本/html”
echo“内容配置:内联”
回声
回显“此处的任何文本”
回声
cat${PATH1}/output.html
回声
)|/usr/sbin/sendmail“$EMAILTO”
你能帮我一下吗,我想我在gsub字段留下了一些东西。

awk'BEGIN{
$ cat tst.awk
BEGIN {
    split("red green yellow",colors); colors[""] = "#f0f0f0"
    split("Delayed On_time No_records",t); for (i in t) cidx[t[i]]=i
}
{
    $NF = sprintf("<span style=\"color:%s\">%s</span>", colors[cidx[$NF]], $NF)
    print
}

$ awk -f tst.awk file
Filename Date Space <span style="color:#f0f0f0">status</span>
xyz.txt Nov18 3.8M <span style="color:green">On_time</span>
mnp.txt Nov11 8.7M <span style="color:red">Delayed</span>
pqr.csv Nov16 9.0M <span style="color:yellow">No_records</span>
打印“”\ "" \ "" } NR==1{打印$0} NR>1{ 如果($NF==“延迟”)color=“红色” 否则如果($NF==“On_time”)color=“绿色” 如果($NF==“无记录”)color=“黄色” else color=“#f0” $NF=”“$NF“” 打印$0 } 结束{ 打印“”\ "" \ "" } 'output.txt>output.html
输出


文件名日期空间状态
xyz.txt 2018年11月3.8M准时
mnp.txt 2011年11月8.7M延迟
pqr.csv 2016年11月9.0M无记录
awk'开始{
打印“”\
"" \
""
}
NR==1{打印$0}
NR>1{
如果($NF==“延迟”)color=“红色”
否则如果($NF==“On_time”)color=“绿色”
如果($NF==“无记录”)color=“黄色”
else color=“#f0”
$NF=”“$NF“”
打印$0
}
结束{
打印“”\
"" \
""
}
'output.txt>output.html
输出


文件名日期空间状态
xyz.txt 2018年11月3.8M准时
mnp.txt 2011年11月8.7M延迟
pqr.csv 2016年11月9.0M无记录

不是完全重写,而是缺少的部分

$awk'开始{color[“On_time”]=“绿色”;
颜色[“延迟”]=“红色”;
颜色[“无记录”]=“黄色”}
颜色{$4=”“$4”“}1'文件中的$4
文件名日期空间状态
xyz.txt 2018年11月3.8M准时
mnp.txt 2011年11月8.7M延迟
pqr.csv 2016年11月9.0M无记录

不是完全重写,而是缺少的部分

$awk'开始{color[“On_time”]=“绿色”;
颜色[“延迟”]=“红色”;
颜色[“无记录”]=“黄色”}
颜色{$4=”“$4”“}1'文件中的$4
文件名日期空间状态
xyz.txt 2018年11月3.8M准时
mnp.txt 2011年11月8.7M延迟
pqr.csv 2016年11月9.0M无记录

这不是一个完整的答案,所以不要接受它,它只是对@RuslanOsmanov的答案的一个建议改进,该答案基于@karakfa的建议,即使用哈希查找而不是一系列if-else来确定要使用的颜色(与@karakfa的建议相比,这显示了如何在映射数组中包含默认值):

$cat tst.awk
开始{
分割(“红-绿-黄”,颜色);颜色[“”]=“#f0”
分割(“延迟时间无记录”,t);对于(t中的i)cidx[t[i]]=i
}
{
$NF=sprintf(“%s”,颜色[cidx[$NF]],$NF)
打印
}
$awk-f tst.awk文件
文件名日期空间状态
xyz.txt 2018年11月3.8M准时
mnp.txt 2011年11月8.7M延迟
pqr.csv 2016年11月9.0M无记录

如果输入文件很大,这将提高脚本效率。

这不是一个完整的答案,所以不要接受它,这只是对@RuslanOsmanov的答案的一个建议改进,它基于@karakfa的建议,即使用散列查找而不是一系列if-else来确定要使用的颜色(与@karakfa的建议相比,这显示了如何在映射数组中包含默认值):

$cat tst.awk
开始{
分割(“红-绿-黄”,颜色);颜色[“”]=“#f0”
分割(“延迟时间无记录”,t);对于(t中的i)cidx[t[i]]=i
}
{
$NF=sprintf(“%s”,颜色[cidx[$NF]],$NF)
打印
}
$awk-f tst.awk文件
文件名日期空间状态
xyz.txt 2018年11月3.8M准时
mnp.txt 2011年11月8.7M延迟
pqr.csv 2016年11月9.0M无记录

如果输入文件很大,这将提高脚本效率。

嗨,karakfa,我没有3条记录,列表包含50多条记录,而且列表总是在变化,你能帮我一下吗?行数无关紧要。你是否尝试将其嵌入脚本中。你需要关键字和颜色映射列表。你可以离开使用模式匹配,但状态应为枚举。使用您的代码后,我得到以下输出。正如我所说,我想通过自动邮件发送输出,但我的输出中没有颜色,请您看看这个。11月17日CHCK09_20161117.txt 19:57 0.119 950延迟***11月18日CHCK01_20161118.txt 08:34 0.442 3517 On_Time 11月18日CHCK02_20161118.txt 08:44 0.001 10 On_Time 11月18日CHCK03_20161118.txt 10:24 0 0 0 0无记录11月17日ifs01_20161117.txt 19:57 0.000 2延迟***你必须用html标记填充..对不起,卡拉卡法,我在html中呆了一周,不知道如何填充html标记,你能帮我吗?非常感谢!你好卡拉卡法,我不知道只有3条记录,列表包含50多条记录,并且列表总是在变化,你能帮我吗?行数无关紧要。你是否尝试将其嵌入到脚本中。你需要关键字列表和颜色映射。你可以通过模式匹配解决问题,但状态应该是枚举。使用代码后,我得到我告诉过你我想通过自动邮件发送输出,但是我的输出中没有颜色,你能看一下吗?11月17日CHCK09_20161117.txt 19:57
$ awk 'BEGIN{color["On_time"]="green"; 
             color["Delayed"]="red"; 
             color["No_records"]="yellow"} 
 $4 in color{$4="<.. color=\""color[$4]"\">" $4 "</..>"}1' file

Filename Date Space status
xyz.txt Nov18 3.8M <.. color="green">On_time</..>
mnp.txt Nov11 8.7M <.. color="red">Delayed</..>
pqr.csv Nov16 9.0M <.. color="yellow">No_records</..>
$ cat tst.awk
BEGIN {
    split("red green yellow",colors); colors[""] = "#f0f0f0"
    split("Delayed On_time No_records",t); for (i in t) cidx[t[i]]=i
}
{
    $NF = sprintf("<span style=\"color:%s\">%s</span>", colors[cidx[$NF]], $NF)
    print
}

$ awk -f tst.awk file
Filename Date Space <span style="color:#f0f0f0">status</span>
xyz.txt Nov18 3.8M <span style="color:green">On_time</span>
mnp.txt Nov11 8.7M <span style="color:red">Delayed</span>
pqr.csv Nov16 9.0M <span style="color:yellow">No_records</span>