使用sed/awk处理特殊CSV:将数值内逗号替换为小数点
解决CSV数值逗号转小数点并保留字段分隔符的问题
你的核心需求是将CSV中数值内部的逗号替换为小数点,同时保留作为字段分隔符的逗号。之前的sed命令失败是因为未启用扩展正则,且匹配逻辑不准确,以下是两种可行的实现方案:
方案1:使用sed(通用正则匹配)
通过扩展正则精准匹配数值内部的逗号(前后为数字、正负号或指数符号),替换为小数点:
sed -E 's/([0-9E+-]),([0-9E+-])/\1.\2/g' P7.csv > P7_test.csv
细节说明:
-E启用扩展正则,无需对括号、量词等符号转义,简化正则写法- 正则
([0-9E+-]),([0-9E+-])确保只替换数值内部的逗号:匹配逗号前后是数字、指数符号E、正负号+-的场景,避免误替换字段分隔符 g标记表示全局替换,处理一行中所有符合条件的逗号
测试你的示例输入:
- 输入
30,-4,098511E-02→ 输出30,-4.098511E-02 - 输入
30,05,-4,098511E-02→ 输出30.05,-4.098511E-02(注:你的示例期望输出此处可能存在笔误,按需求逻辑应替换该逗号) - 输入
66,7,-1,865433→ 输出66.7,-1.865433
方案2:使用awk(按固定字段规则处理)
如果明确知道每行最终应保留2个字段,可根据当前行的字段数量(逗号数量)执行合并替换:
awk -F',' '{ if (NF == 3) { # 3个字段:保留第一个字段,合并后两个字段并替换逗号为小数点 print $1 "," $2 "." $3 } else if (NF == 4) { # 4个字段:分别合并前两个、后两个字段,替换内部逗号为小数点 print $1 "." $2 "," $3 "." $4 } }' P7.csv > P7_test.csv
细节说明:
-F','指定逗号为字段分隔符NF代表当前行的字段总数,根据数值执行对应合并逻辑,适合字段拆分规则明确的场景
内容的提问来源于stack exchange,提问作者user979974
相关产品推荐
相关产品推荐

