如何去除Unix文件中CSV字段内的多余双引号和换行符
问题描述
我有一个CSV文件,字符串和日期字段用双引号包裹,但字段内部出现了多余双引号和换行符。
示例输入:
"1234","asdf","with"doublequotes","new line feed","withmultiple""doublequotes"
期望输出:
"1234","asdf","withdoublequotes","new linefeed","withmultipledoublequotes"
我尝试过以下sed命令:
sed 's/\([^",]\)"\([^",]\)/\1\2/g;s/\([^",]\)""/\1"/g;s/""\([^",]\)/"\1/g' < infile > outfile
但该命令会移除字符串中的双引号,且丢失最后一个双引号,结果如下:
"1234","asdf","withdoublequotes","new line feed","withmultiple"doublequotes
请问是否有方法去除字段内(即",和,"之间)的多余双引号和换行符?
解决方案
方法一:使用awk处理(推荐)
awk能更精准识别CSV字段边界,同时处理跨行内容,脚本如下:
BEGIN { FS = "\"" OFS = "\"" full_content = "" } { full_content = full_content $0 } END { split_count = split(full_content, parts, "\"") for (i = 1; i <= split_count; i++) { # 偶数索引的部分是双引号包裹的字段内部内容 if (i % 2 == 0) { gsub(/"/, "", parts[i]) # 移除字段内所有多余双引号 gsub(/\n/, "", parts[i]) # 移除字段内所有换行符 } # 按原格式拼接输出,最后一行加换行 printf "%s%s", parts[i], (i == split_count ? "\n" : OFS) } }
使用方式:
- 将上述脚本保存为
clean_csv.awk - 执行命令:
awk -f clean_csv.awk infile > outfile
方法二:使用GNU sed处理
如果需要用sed,需使用支持跨行操作的GNU sed,命令如下:
sed -z 's/"\([^"]*\)"/"\1"/g;s/\([^",]\)"\([^",]\)/\1\2/g;s/\n//g' infile > outfile
说明:
-z选项让sed把整个文件当作单行处理,解决跨行字段的问题- 第一个替换规则确保字段边界的双引号保留
- 第二个替换规则移除字段内部的单个多余双引号
- 第三个替换规则移除所有换行符
内容的提问来源于stack exchange,提问作者vishnu
相关产品推荐
相关产品推荐

