我有一个包含以下数据的文件:
“A”,”Dept1”,”i am mahesh,working in it”,”1”
“B”,”Dept2”,”i am suresh, working in non it”,”2”
我想要的输出是:
A,Dept1,i am mahesh~working in it,1
B,Dept2,i am suresh~working in non it,2
我在下面尝试过,但它正在用 ~ 替换 all ,如下所示:
awk -F ‘“,”’ -v OFS=‘’ ‘{for (i=0;i<=NF;++i) gsub(“,”,”~”,$i)}1’ file
“A”~”Dept1”~”i am mahesh~working in it”~”1”
“B”~”Dept2”~”i am suresh~working in non it”~”2”
使用结构化文档格式时,请使用了解该特定格式的工具,而不是通用的文本处理工具。
在 CSV 文件中,除非已知它是“简单的”,否则引用的字段可能包含逗号和换行符。引用字段中的引号加倍 (
""
)。要将嵌入式逗号更改为波浪号 (
~
),您最好使用 CSV 感知工具,例如mlr (Miller) 或csvkit。下面,我假设引用字符是普通的双引号 (
"
),而不是您在问题文本 (”
) 中使用的弯引号。这是用 转换第三个字段
mlr
,这是一个方便的工具,可以识别几种不同的结构化格式:该
--csv
选项导致mlr
输入和输出 CSV 数据,并-N
告诉实用程序我们的数据没有标题。然后我们应用put
“动词”(动作)并给它一个如果你习惯的话应该看起来很熟悉的表达式awk
(尽管参数的顺序sub()
不同)。使用
csvformat
(来自 csvkit),我们可以重新格式化数据,以便我们可以更轻松地找到我们想要更改的逗号。我首先将分隔符更改为
@
(任何尚未包含在数据中的字符):然后我可以简单地使用
tr
将剩余的逗号更改为波浪号:然后再次使用将分隔符切换回逗号
csvformat
:请注意,这会将所有嵌入的逗号更改为波浪号,而不仅仅是第三列中的逗号。
将结果重定向到新名称以将其保存到文件中。
尝试
sed
a) 将所有出现的逗号 NOT 在双引号之间更改为波浪号,然后 b) 删除所有双引号:-i
如果结果很好,请使用原地替换文件。假设所有字段在使用前都用引号括起来。