如何在Bash中提取CSV文件数字列总和并关联多列数据?
嘿,我来帮你搞定BASH里处理CSV计算总和并生成目标HTML表格的问题!
解决方案:用awk处理CSV并生成完整HTML表格
假设你的CSV文件名为data.csv,表头包含title、subject_sex、box_office三列(不管列顺序如何都能适配),可以用下面的awk命令一步完成数据提取、总和计算和HTML表格生成,直接覆盖你之前创建的sss.html:
awk -F ',' ' # 处理表头,动态获取各列的索引 NR == 1 { for (i=1; i<=NF; i++) { if ($i == "title") title_col = i; else if ($i == "subject_sex") sex_col = i; else if ($i == "box_office") box_col = i; } # 输出HTML头部结构 print "<html><body><table><tr><th>gender</th><th>Total</th><th>Titles</th></tr>"; next; } # 遍历数据行,按性别分组累加票房、收集标题 NR > 1 { # 处理可能带引号的CSV字段(如果你的CSV字段有引号包裹) sex = $sex_col; gsub(/^"|"$/, "", sex); box = $box_col; gsub(/^"|"$/, "", box); title = $title_col; gsub(/^"|"$/, "", title); total[sex] += box; titles[sex] = titles[sex] (titles[sex] ? ", " : "") title; } # 所有行处理完后,输出分组结果的表格行 END { for (sex in total) { print "<tr><td>" sex "</td><td>" total[sex] "</td><td>" titles[sex] "</td></tr>"; } # 输出HTML尾部结构 print "</table></body></html>"; }' data.csv > sss.html
关键细节说明:
-F ',':指定CSV的分隔符为逗号,适配标准CSV格式- 动态列索引:表头处理部分会自动识别三列的位置,不管你的CSV列顺序是怎样的都能正常工作
- 引号处理:
gsub(/^"|"$/, "", ...)用来移除字段前后的双引号(如果你的CSV字段是用引号包裹的,比如"female","Barbie",1234567,这一步会把字段转成干净的文本) - 分组逻辑:用awk的关联数组
total存储每个性别的总票房,titles存储对应性别的所有标题(用逗号分隔多个标题) - 直接生成HTML:命令会输出完整的HTML内容,直接覆盖你之前创建的
sss.html,不用手动修改表格里的*占位符
简化版(如果CSV没有引号包裹)
如果你的CSV字段没有用双引号包裹,可以去掉所有gsub行,简化成:
awk -F ',' ' NR == 1 { for (i=1; i<=NF; i++) { if ($i == "title") title_col = i; else if ($i == "subject_sex") sex_col = i; else if ($i == "box_office") box_col = i; } print "<html><body><table><tr><th>gender</th><th>Total</th><th>Titles</th></tr>"; next; } NR > 1 { sex = $sex_col; box = $box_col; title = $title_col; total[sex] += box; titles[sex] = titles[sex] (titles[sex] ? ", " : "") title; } END { for (sex in total) { print "<tr><td>" sex "</td><td>" total[sex] "</td><td>" titles[sex] "</td></tr>"; } print "</table></body></html>"; }' data.csv > sss.html
测试小技巧
如果想先验证计算结果是否正确,可以先把输出重定向到终端查看,比如把命令末尾的> sss.html改成| head -20,确认数据没问题后再写入文件。
内容的提问来源于stack exchange,提问作者Rahul Kapoor
相关产品推荐
相关产品推荐

