关于修正Bash转CSV脚本start_times列多余引号的技术咨询
解决CSV输出start_times列多余引号的脚本修改方案
问题根源
通常是因为原始数据中的start_times字段本身已包含引号,而脚本又对该字段额外添加了CSV格式的引号,导致嵌套重复出现。
具体修改步骤
1. 剥离原始字段引号后再格式化(awk场景)
如果你的脚本使用awk处理键值对数据,修改start_times字段的赋值逻辑,用gsub去掉字段首尾的引号:
awk -F'=' '{ if ($1 == "job_name") job_name=$2; if ($1 == "start_times") { # 移除字段首尾的双引号 gsub(/^"|"$/, "", $2) start_times=$2 } } END { printf "\"%s\",\"%s\"\n", job_name, start_times }' test.txt
2. 避免重复添加引号(CSV工具场景)
如果使用csvkit这类专用工具辅助转换,不要同时启用自动引号和手动添加引号:
- 错误写法(重复添加引号):
csvformat -U 1 test.txt | awk '{print "\""$1"\",\""$2"\""}' - 修正写法:直接用工具处理原始数据,或仅做一次引号包裹:
# 先将键值对转为CSV结构,再统一格式化 awk -F'=' '{print $1","$2}' test.txt | csvformat -U 1
3. 通用引号处理函数(兼容带逗号字段)
如果需要兼容字段内包含逗号的场景,可封装通用处理函数,避免重复引号:
# 定义引号处理函数:先剥离已有首尾引号,再添加标准CSV引号 quote_field() { local raw_str="$1" # 去掉首尾引号 raw_str="${raw_str%\"}" raw_str="${raw_str#\"}" printf "\"%s\"" "$raw_str" } # 在脚本中调用函数处理字段 awk -F'=' '{ if ($1 == "job_name") job_name=$2; if ($1 == "start_times") start_times=$2; } END { printf "%s,%s\n", quote_field(job_name), quote_field(start_times) }' test.txt
验证效果
执行修改后的脚本,输出会从错误格式(如"daily_backup","""09:00,17:00""")变为正确格式:"daily_backup","09:00,17:00"
内容的提问来源于stack exchange,提问作者NecroCoder
相关产品推荐
相关产品推荐

