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中的双引号就没有了,会导致重复匹配。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Linux指令中文说明传送入口 整理自Linux指令中文说明 文本和数据进行处理的编程语言awk 是一种编程语言,...
    释闲人阅读 6,600评论 1 6
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 5,525评论 0 4
  • 一.AWK说明 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个...
    __一蓑烟雨__阅读 1,612评论 0 0
  • 一. AWK 说明 awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并...
    西华子阅读 4,468评论 0 4
  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 5,049评论 0 8