如何修改Shell脚本循环处理CSV所有行并实现条件高亮
批量处理CSV生成高亮HTML表格的Shell脚本优化
需求说明
现有Shell脚本仅能处理CSV文件的一行数据,需修改为循环处理所有行:当CSV第4列数值大于第3列时,将第4列以红色背景(bgcolor="red")的HTML格式输出到compare.txt文件,该文件将用作邮件正文以显示高亮效果。
输入CSV示例
App Launch Time, Login Page, 7091, 8091 Page Load Time, Home Page, 303, 993 Page Api Response, Home Page, 861, 761 Page Parsing Time, Home Page, 141, 221
现有脚本问题
原脚本直接通过awk读取整列赋值给变量,会将所有行的字段内容拼接在一起,无法实现逐行判断和处理;同时缺少<table>开头标签,HTML结构不完整,邮件客户端无法正确渲染表格。
优化后的脚本
# 清空目标文件,避免旧内容残留 > compare.txt # 写入HTML表格开头标签 echo '<table border="1">' >> compare.txt # 用awk逐行处理CSV,生成对应HTML行 awk -F',' ' { # 去除每个字段前后的空白字符 gsub(/^[[:space:]]+|[[:space:]]+$/, "", $1) gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2) gsub(/^[[:space:]]+|[[:space:]]+$/, "", $3) gsub(/^[[:space:]]+|[[:space:]]+$/, "", $4) # 判断第4列是否大于第3列,生成对应HTML行 if ($4 > $3) { printf "<tr><td align=\"center\">%s</td><td align=\"center\">%s</td><td align=\"center\">%s</td><td align=\"center\" bgcolor=\"red\">%s</td></tr>\n", $1, $2, $3, $4 } else { printf "<tr><td align=\"center\">%s</td><td align=\"center\">%s</td><td align=\"center\">%s</td><td align=\"center\">%s</td></tr>\n", $1, $2, $3, $4 } }' input.csv >> compare.txt # 写入HTML表格结尾标签 echo '</table>' >> compare.txt
关键优化点
- 逐行处理:利用
awk本身的逐行遍历特性,替代低效的Shell循环,同时避免整列赋值的错误 - 字段清洗:通过
gsub去除字段前后的空格,保证HTML内容整洁 - 完整HTML结构:添加
<table>标签,确保邮件客户端能正确识别表格格式 - 精准判断:直接在
awk内完成数值比较,逻辑更简洁高效
输出示例(部分行)
<tr><td align="center">App Launch Time</td><td align="center">Login Page</td><td align="center">7091</td><td align="center" bgcolor="red">8091</td></tr> <tr><td align="center">Page Load Time</td><td align="center">Home Page</td><td align="center">303</td><td align="center" bgcolor="red">993</td></tr> <tr><td align="center">Page Api Response</td><td align="center">Home Page</td><td align="center">861</td><td align="center">761</td></tr>
内容的提问来源于stack exchange,提问作者ASHOK DAUKIYA
相关产品推荐
相关产品推荐

