使用Unix脚本移除CSV文件双引号内的换行符(LF/ )
嘿,我来帮你搞定CSV文件里双引号内部换行符的问题!针对你需要移除双引号内所有LF换行的需求,我给你准备了一个用awk写的可靠脚本,它能精准识别引号内的内容,不会误删引号外的换行。
脚本实现
你可以把下面的代码存成clean_quote_newlines.awk文件:
BEGIN { FS = "" # 把每个字符单独作为字段处理 in_quote = 0 # 标记是否处于双引号内部 } { # 逐个字符遍历处理 for (i=1; i<=NF; i++) { # 遇到双引号就切换引号内状态 if ($i == "\"") { in_quote = !in_quote } # 如果在引号内且是换行符,替换成空格(也可以直接删掉) if (in_quote && ($i == "\n" || $i == "\r")) { printf " " } else { printf "%s", $i } } }
怎么用?
直接在终端运行命令就行:
awk -f clean_quote_newlines.awk 你的输入文件.csv > 处理后的输出文件.csv
嫌存文件麻烦的话,也可以用一行命令搞定:
awk 'BEGIN{FS=""; in_quote=0} {for(i=1;i<=NF;i++){if($i=="\"") in_quote=!in_quote; if(in_quote && ($i=="\n"||$i=="\r")) printf " "; else printf "%s",$i}}' input.csv > output.csv
为啥这个脚本靠谱?
- 它会逐个检查每个字符,精准判断当前是否在双引号里,不会把引号外的换行给改了
- 不仅处理LF(
\n),还能处理CR(\r),覆盖常见的换行格式 - 如果你不想把换行换成空格,而是直接删掉,只要把脚本里的
printf " "改成printf ""就行
测试一下你的示例
输入(带内部换行的CSV):
No,Status,Date 1,"Success Error",1/15/2018 2,"Success Error NA",2/15/2018 3,"Success Error",3/15/2018
处理后的输出:
No,Status,Date 1,"Success Error",1/15/2018 2,"Success Error NA",2/15/2018 3,"Success Error",3/15/2018
完全符合你的预期哦!
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

