首页 > 解决方案 > 如果每个字段没有使用 sed/awk/perl 用引号括起来,则为每个字段添加引号

问题描述

如果字段值未用引号括起来,我想为每个字段添加引号。

场景1:以下是我的输入

eno;ename;address;gender
1;AaA;"mnop qrstzyx";M
2;bB;"abc";F
3;cC;"adef;mnp";ars
4;mnp;ade;M

预期产出

"eno";"ename";"address";"gender"
"1";"AaA";"mnop qrstzyx";"M"
"2";"bB";"abc";"F"
"3";"cC";"adef;mnp";"ars"
"4";"mnp";"ade";"M"

我尝试过的选项

sed 's/[^;]*/"&"/g'

场景2:以下是我的输入

eno;ename;address;gender
1;AaA;"mnop 
qrst
zyx";M
2;bB;"abc";F
3;cC;"adef;
mnp";ars
4;mnp;ade;M

预期产出

"eno";"ename";"address";"gender"
"1";"AaA";"mnop qrstzyx";"M"
"2";"bB";"abc";"F"
"3";"cC";"adef;mnp";"ars"
"4";"mnp";"ade";"M"

标签: perlawksed

解决方案


使用FPATwithgnu awk处理 CSV 文件

awk -v FPAT='([^;]*)|("[^"]+")' -v OFS=";" '{for (i=1;i<=NF;i++) {if ($i!~/^\"/) $i="\""$i"\""}} 1' file
"eno";"ename";"address";"gender"
"1";"AaA";"mnop qrstzyx";"M"
"2";"bB";"abc";"F"
"3";"cC";"adef;mnp";"ars"
"4";"mnp";"ade";"M"

推荐阅读