免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1200 | 回复: 6
打印 上一主题 下一主题

[文本处理] 依然是awk,关于值内分隔符的处理疑问【谁知道awk的FPAT怎么用】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-31 11:23 |只看该作者 |倒序浏览
本帖最后由 xylcxyfc 于 2015-03-31 15:30 编辑

众所周知,awk处理CSV文件中逗号分隔符要使用FPAT,因为逗号这个分隔符可能会被包含在值中。
现假设有文件s.dat内容如下:

"2000079086,001859"
"2000079086""001859"
"20000,79086""001859"

这个文本每行事先都认为是一个字段,但是使用下面这个命令输出每行的分割数量时:
awk 'BEGIN{FPAT = "([^,]+)|(\"[^\"]+\")"}{print "line "NR": "NF;print $1"@@"$2}' s.dat
结果却是:

line 1: 1
"2000079086,001859"@@
line 2: 1
"2000079086""001859"@@
line 3: 2
"20000,79086"@@"001859"

第三行只不过是前两种情况的结合,结果却被awk认为是两个字段,这是不正确的。

那么有没办法对第三行也认为是一个分割数量呢?

-------------
这个文件输出时候的规则是:逗号分隔字段,字符串值用引号括住,值内的任何一个双引号替换为两个双引号。

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
2 [报告]
发表于 2015-03-31 13:03 |只看该作者
回复 1# xylcxyfc
  1. px@ubuntu:~$ echo '"2000079086,001859"
  2. "2000079086""001859"
  3. "20000,79086""001859"' | awk 'BEGIN{FPAT = "([^,]+)|(\"[^\"]+\")"}{print "line "NR": "NF;print $1"@@"$2}'
  4. line 1: 1
  5. "2000079086,001859"@@
  6. line 2: 1
  7. "2000079086""001859"@@
  8. line 3: 1
  9. "20000,79086""001859"@@
复制代码
运行结果跟你不一样,
  1. px@ubuntu:~$ awk --version
  2. GNU Awk 3.1.8
  3. Copyright (C) 1989, 1991-2010 Free Software Foundation.

  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or
  7. (at your option) any later version.

  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU General Public License for more details.

  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see http://www.gnu.org/licenses/.
复制代码

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
3 [报告]
发表于 2015-03-31 13:25 |只看该作者
我的和你的一样回复 2# liion631818


   

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
4 [报告]
发表于 2015-03-31 13:26 |只看该作者
回复 2# liion631818


    我记得 FPAT 貌似是在 gawk 4.0+ 中新增的变量吧

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
5 [报告]
发表于 2015-03-31 14:02 |只看该作者
回复 4# reyleon
恭喜你记对了! http://bbs.chinaunix.net/thread-4125586-1-1.html


   

论坛徽章:
0
6 [报告]
发表于 2015-03-31 14:37 |只看该作者
本帖最后由 xylcxyfc 于 2015-03-31 14:44 编辑

回复 2# liion631818


    照你的命令写结果和主楼一样。
    我的awk版本是4.0.2,特意为了这个功能换的CentOS7。
    另外一个问题:
    fpat照我之前写的那样竟然直接把空值忽略掉了,也就是说形似,,,,,,这样的内容awk识别的结果NF=0。原因是因为在限制FPAT的同时那个正则也规定了每个值至少一个任意字符,然后我改成了FPAT = "([^,]+)|(\"[^\"]+\")|",就又可以识别空值了,暂时不知道有没有BUG,因为实在不懂这个FPAT中|的机制是贪婪还是什么。
关于一层的那个问题,如果awk能够识别零宽正则就好办多了。

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
7 [报告]
发表于 2015-04-02 10:28 |只看该作者

CSV的处理,FPAT 的用法 - 只适用于GNU awk 4 以上

http://bbs.chinaunix.net/thread-4125586-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP