免费注册 查看新帖 |

Chinaunix

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

[文本处理] 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
21 [报告]
发表于 2015-06-04 15:21 |只看该作者
回复 18# ly5066113


    这个我觉得 , 02 是数字, awk 会转换为数字 02 为 数字 2, 数字 2== 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
22 [报告]
发表于 2015-06-04 15:27 |只看该作者
回复 18# ly5066113


    就 好比 awk 'BEGIN{print 02}' 一样

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

$ awk 'BEGIN{if(02==2"")print "true"}'
true

$ awk 'BEGIN{if(02=="02")print "true"}'

$ awk 'BEGIN{if(02=="2")print "true"}'
true

A == B
1. 02 == 2""
A= 02 = numeric (number 2)
B= numeric (number 2) and string("") = (number 2 to string "2") and string ("") = "2"
B is string, and A(number 2) need to be a string (number 2 to string "2")
A (string "2") and B ( string "2") are the same

2. 02 == "02"
A = 02 = numeric (number 2)
B = "02" = string  "02"
A (number 2) to string "2"
A (string "2") and B (string "02") are not the same

3. 02 == "2"
A = 02 = numeric (number 2)
B = "2" = string  "2"
A (number 2) to string "2"
A (string "2") and B (string "2") are the same

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


回到你上面的类型 STRING、NUMBERIC、STRNUM

我们只观察赋值全部为数字的情况,其他不做讨论。
awk内部,给一个变量赋值,只可能是 STRING型或者NUMBERIC型,不可能是STRNUM
  1. $ awk 'BEGIN{id=02}$1==id{print $1,id}' file
  2. 2 2
  3. 02 2
  4. $ awk 'BEGIN{id="02"}$1==id{print $1,id}' file
  5. 02 02
复制代码
而用 -v 方法赋值,只可能是 STRNUM型或者NUMBERIC型,不可能是STRING型
  1. $ awk -vid=02 '$1==id{print $1,id}' file
  2. 2 02
  3. 02 02
  4. $ awk -vid="02" '$1==id{print $1,id}' file
  5. 2 02
  6. 02 02
复制代码

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


没错,awk内部,无法给一个变量赋值为 STRNUM 型,只能为 STRING 或 NUMBERIC。

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


    我觉得不对!

1. 在 awk 内部, 三种类型都有:

id=02, 这是 NUMBERIC(数字) 类型;
id="02" , 这是 STRING(字符串),
这两种类型可以说是用户明确指定的!  

但是读取到的字段的赋值, 只可能是STRNUM(字符串数字)和 STRING(字符串)三种类型 , 比如 $1, 则是 STRNUM 类型, 是动态判断出来的!



2. -v 赋值, 也就是从外部传递进来的, 在内部动态确定类型的时候, 只可能是 STRNUM(字符串数字) 和 STRING(字符串),  不可能是 NUMBERIC(数字)


3. 然后这三种类型之间的比较, 最终到底是通过什么类型去比较,  就是根据我上面贴的那个图中的类型进行比较的.


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


$1 这种不在考虑范围之内,它是由 awk 自己处理的,不是我们人为赋值的。
或者换句话来讲,我想把一个变量赋值为 STRNUM 型,值为 02,怎么做?

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


-v 方式赋值,怎么将一个变量赋值为 STRING 型,值为 02。

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


    如果是针对数字而言, 那确实不能通过 -v 的形式让数字在awk内部成为 STRING 类型.   

结论: -v 传进去的如果是数字, 那这个数字是 STRNUM 或 NUMBERIC  类型 (这个时候这两个类型意义一样,没区别),  传进去的字符串那就是 STRING 类型.

求职 : 机器学习
论坛徽章:
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
30 [报告]
发表于 2015-06-04 16:23 |只看该作者
shell版块各位大神展开了热烈的讨论。。。。。牛啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP