Bash处理CSV时如何对带>、<符号的字段值执行对应加减运算
Bash实现CSV字段带比较符号的数值转换方案
sed本身是纯文本流编辑工具,无内置算术运算能力,处理这类需要数值计算的字段转换场景,优先选用awk实现,天然支持分隔符拆分、字段遍历、数值运算,写法简洁性能更好。
核心实现逻辑
对拆分后的每个数值项做判断:
- 项以
>开头:截取符号后的数值执行+1操作 - 项以
<开头:截取符号后的数值执行-1操作 - 无符号普通数值:直接保留原值
- 所有项处理完成后用原分隔符拼接,保持文件格式不变
可直接运行的代码
1. 单字符串测试(匹配给出的示例场景)
echo "5;10;>11;20;<14" | awk -F';' -v OFS=';' '{ for(i=1;i<=NF;i++){ if(sub(/^>/,"",$i)) $i += 1 else if(sub(/^</,"",$i)) $i -= 1 } print }'
执行后输出结果:
5;10;12;20;13
和预期结果完全一致。
2. 处理完整CSV文件场景
如果是处理CSV文件中指定列(比如第2列,列内值为分号分隔的数值串,CSV本身为逗号分隔),使用如下命令即可批量处理:
awk -F',' -v OFS=',' '{ split($2, items, /;/) output = "" for(idx in items){ val = items[idx] if(sub(/^>/,"",val)) val += 1 else if(sub(/^</,"",val)) val -= 1 output = output (output ? ";" : "") val } $2 = output print }' target.csv > processed.csv
处理后的结果会写入processed.csv文件,可根据实际文件格式调整参数:
- 把
-F','和-v OFS=','里的逗号换成CSV实际用的列分隔符(比如制表符就写成\t) - 把代码里的
$2换成要处理的实际列序号即可
补充说明
- 该逻辑天然支持整数、浮点数计算,比如
>3.6会计算为4.6,<5.2会计算为4.2,无需额外修改 - 不推荐用sed嵌套shell命令的方式实现算术逻辑,写法冗余、可读性差,大文件处理性能远低于awk
内容的提问来源于stack exchange,提问作者Javier Biotech
相关产品推荐
相关产品推荐

