免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lwlzflwl
打印 上一主题 下一主题

[文本处理] awk匹配字段有奇怪现象,请高手指点 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2015-06-04 12:53 |只看该作者
本帖最后由 liuyu85 于 2015-06-04 13:02 编辑

回复 9# yestreenstars


    awk -v的时候是shell解析,而awk的单引号中间的代码是awk解析,不只是BEGIN,只要是awk的单引号内部中出现双引号的内容,就是确定了是字符串类型

这个例子比较能说明问题:
  1. awk -F'\t' -v id='201506021717179991015' 'BEGIN{begin="201506021717179991015";a="201506021717179991015"}{if($1==id)print "id: "$0;if($1==a)print "a: "$0;if($1==begin)print "begin: "$0}'
复制代码

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
12 [报告]
发表于 2015-06-04 13:28 |只看该作者
学习了~~~~

论坛徽章:
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
13 [报告]
发表于 2015-06-04 13:28 |只看该作者
@jason680@yestreenstars

跟 BEGIN 有关啊. 在awk内部, 凡是通过双引号引起来的, 都是字符串, 而如果是外部传进来的, 就会在内部判断类型

如果外部传递进来的是数字, 则是"数字字符串", 被定义为有 strnum 的属性. STRNUM 与 NUMERIC 比较, 是通过 numeric 操作的.


$ awk -vid='2' '$1==id' FILE , 这个例子, 2传进来是 strnum , $1 也是 strnum, 相比较, 则是通过 numeric 操作的
2
02

$ awk -vid='2' '$1==id""' FILE, 而这个例子, 2传进来是 strnum ,然后 strnum 与 "" 结合, 即是做了字符串串联的方法, 就会变成字符串类型, 实际上就是 STRING, 而 $1 还是 strnum, strnum 与 STRING 做比较运算, 实际上是通过 string 做的比较操作呀
2
id and ""(empty string) are combined together to be a string

$ cat FILE
1
2
01
02
01x
02a

我的理解就是这样的! 还请指教, 下图是手册上说的:





论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
14 [报告]
发表于 2015-06-04 13:38 |只看该作者
又涨知识了,赞各位大神。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
15 [报告]
发表于 2015-06-04 14:41 |只看该作者
本帖最后由 jason680 于 2015-06-04 14:48 编辑

回复 13# reyleon


$ awk 'BEGIN{id=2}$1==id' FILE
2
02

$ awk 'BEGIN{id="2"}$1==id' FILE
2

   

论坛徽章:
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
16 [报告]
发表于 2015-06-04 15:03 |只看该作者
回复 15# jason680


   
$ awk 'BEGIN{id=2}$1==id' FILE   //这里的 id 是 NUMERIC 类型, $1 是 STRNUM 类型, NUMERIC  与 STRNUM做比较, 以 NUMERIC  进行比较操作
2
02

$ awk 'BEGIN{id="2"}$1==id' FILE //这里的 id 是 STRING 类型, $1 是 STRNUM 类型, STRING 与 STRNUM做比较, 以 STRING 进行比较操作
2

$ awk -v id=2 '$1==id' FILE  or awk -v id="2" '$1==id' FILE   // 这里的id 都是 STRNUM 类型, $1 是 STRNUM 类型, STRNUM 与 STRNUM做比较, 以 NUMERIC  进行比较操作

-----------
我的意思是, 在 BEGIN 里, 也就是awk内部, 可以由用户去定义比较的类型, 而 从外部传进来的, 没法由用户去定义比较的类型, 只能由 awk 解释器自己去判断其类型, 并进行比较!!!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
17 [报告]
发表于 2015-06-04 15:09 |只看该作者
本帖最后由 jason680 于 2015-06-04 15:19 编辑

回复 16# reyleon

>>跟 BEGIN 有关啊. 在awk内部, ....

你说的STRING,STRNUM,NUMERIC都对,
结论不能用"BEGIN有关......"这种说法

结论:跟id类型有关(STRING,STRNUM,NUMERIC)

连BEGIN都没有,跟BEGIN何关?
$ awk '{id=2}$1==id' FILE
2
02

$ awk '{id="2"}$1==id' FILE
2




   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
18 [报告]
发表于 2015-06-04 15:12 |只看该作者
回复 16# reyleon


同意,BEGIN可以用户自定义类型,-v 则不行。
但下面这个怎么解释呢?
  1. $ awk 'BEGIN{if(02==2"")print "true"}'
  2. true
  3. $ awk 'BEGIN{if(02=="2")print "true"}'
  4. true
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
19 [报告]
发表于 2015-06-04 15:15 |只看该作者
回复 17# jason680


reyleon 发表于 2015-06-04 15:03
我的意思是, 在 BEGIN 里, 也就是awk内部, 可以由用户去定义比较的类型


主要意思是“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
20 [报告]
发表于 2015-06-04 15:16 |只看该作者
回复 17# jason680


       你这算钻牛角尖儿了吧!!! 我说的 BEGIN 也意泛指awk内部, 总之就是那么回事儿吧, 大家伙明白就行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP