Shell脚本新手求助:CSV字符串转数值并实现列求和
解决CSV带引号数值的awk求和问题
嘿,作为Shell脚本新手遇到这种CSV格式不一致的问题太正常了!你的核心问题是部分数值被单/双引号包裹,awk默认会把它们当成字符串处理,直接求和自然得不到正确结果。下面给你几个实用的解决方案:
方法1:先清理引号再求和(最稳妥)
用awk的gsub函数把所有单双引号、甚至可能存在的空格都清理掉,再对数值进行累加。同时记得跳过表头行(NR>1):
同时计算likes和dislikes列的总和
awk -F',' 'NR>1 { # 清理第1列的引号和空格 gsub(/["'\'']|[:space:]/, "", $1) # 清理第2列的引号和空格 gsub(/["'\'']|[:space:]/, "", $2) sum_likes += $1 sum_dislikes += $2 } END { print "Total likes: " sum_likes print "Total dislikes: " sum_dislikes }' your_data.csv
只计算单个列(比如likes)
如果只需要某一列的总和,简化一下:
awk -F',' 'NR>1 {gsub(/["'\'']/, "", $1); sum+=$1} END {print sum}' your_data.csv
方法2:强制类型转换(快速小技巧)
其实awk会自动尝试把字符串转成数值,但带引号的话可能有歧义。你可以通过加0的方式强制把清理后的字符串转成整数,效果和上面类似:
awk -F',' 'NR>1 {sum += ($1 + 0)} END {print sum}' your_data.csv
不过这个方法的前提是字段里除了引号和数字没有其他杂字符,不然可能出错,所以还是方法1更可靠。
测试你的示例数据
假设你的CSV内容是:
'likes','dislikes' "61","110" 120, 70
运行方法1的命令后,会得到:
Total likes: 181 Total dislikes: 180
完全符合预期!
内容的提问来源于stack exchange,提问作者Anoop John Alocious
相关产品推荐
相关产品推荐

