awk实战7-去掉双引号中间的字符串包含的逗号

1、问题举例

有时候,文本文件中的数量、金额等数字会用千分位隔开,例如下面的例子file.csv,营收字段用千分位分隔,并用双引号括起来,表示这是一个字段的数据,避免跟其他字段混淆:

月份,企业,员工数,营收,利润
201901,企业A,1500,"1,234,567.89",400
201902,企业B,300,900.01,100

当金额没有超过1000时,就不存在千分位,也没有双引号。

那么,我们就不能简单的用awk -F"," 来指定逗号为分隔符对文件进行处理,因为awk不能区分千分位和逗号分隔符。

推而广之,问题就是我们如何去除双引号中间的逗号。

2、处理方法

因为文件中有的行有双引号,有的行没有双引号,所以我们先处理带双引号的行。

处理的关键是把双引号作为字段分隔符,这样我们就可以把两个双引号中间部分的字符串提取出来,并利用gsub函数把逗号全部替换为空。

命令:
awk -F"\"" '/".*"/ {gsub(",","",$2); print $1$2$3}'  file.csv

输出:
201901,企业A,1500,1234567.89,400

说明:

awk -F"\""   是指定双引号为分隔符
/".*"/       是用正则表达式匹配有两个双引号的行
gsub(",","",$2)   是把两个双引号中间的字符串中的逗号全部替换为空

不带双引号的行直接输出即可,完整命令如下:

awk -F"\"" '! /".*"/ {print $0} /".*"/ {gsub(",","",$2); print $1$2$3}' file.csv

注意,这里要把不带双引号的部分 ! /".*"/ {print $0} 原样输出放在前面处理,原因是gsub函数处理后$0中的双引号就没有了,会导致重复匹配。

你可能感兴趣的:(awk实战7-去掉双引号中间的字符串包含的逗号)