免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2748 | 回复: 10

[文本处理] awk问题 [复制链接]

论坛徽章:
0
发表于 2014-07-30 14:05 |显示全部楼层
seq 10 | awk 'i=!i'

大侠们,帮我解释下这句话啊


[root@UAT-TEST home]# seq 10 | awk 'i=!i'
1
3
5
7
9

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
发表于 2014-07-30 14:13 |显示全部楼层

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
发表于 2014-07-30 14:13 |显示全部楼层
处理第一行是i没有定义是null,所以!i==1,打印
处理第二行时i取第一行值是1,所以!i=0,不打印
....
实现奇数行打印

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-07-30 14:14 |显示全部楼层
  1. i=!i 是读取第一条数据后,进行Pattern匹配的时候,i为一个未定义的变量,按照awk对未定义变量的处理方式,这是i的值为0,那么!i即!0,!为取反,0为假,则!0即为真,因此该赋值语句的结果就是i=!0,即给i赋值为1.
  2. 所在 Pattern可等价为1,而1为真,Pattern匹配成功,输出当前记录。
  3. 读取第二条记录的时候,i=1,i=!i的结果为i=0,因此Pattern为0,Pattern匹配失败,其后读取的内容以此循环以上过程
复制代码

论坛徽章:
0
发表于 2014-07-30 14:34 |显示全部楼层
回复 4# lifayi2008


    读取第二条记录的时候,i=1,i=!i的结果为i=0,因此Pattern为0,Pattern匹配失败,其后读取的内容以此循环以上过程

这句能再解释下吗?这句没看明白

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-07-30 14:45 |显示全部楼层
这句里面哪个地方不明白?上一行处理完毕后  i 变量为1   !i 就表示0  那么i=!i   就是 i = 0  所以整个表达式结果也为0   所以就表示不打印本行   如果命令结构中有个1实际上后面还隐含一个{print}的语句,那么0就表示没有print所以不打印回复 5# 瘦瓜


   

论坛徽章:
0
发表于 2014-07-30 14:57 |显示全部楼层
回复 6# lifayi2008

就是这句”i 变量为1   !i 就表示0 “中的后面半句卡住了   
    !i 就表示0
求解啊

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-07-30 15:07 |显示全部楼层
!是布尔操作符   操作数被认为是布尔值     非0(假) 即1(真)   我是这样理解的回复 7# 瘦瓜


   

论坛徽章:
0
发表于 2014-07-30 15:36 |显示全部楼层
回复 8# lifayi2008


    恩,是的,打印完一行之后,变量i为什么会变成1?就是。。。

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-07-30 15:40 |显示全部楼层
都不知道你想问啥了,变量在整个awk处理过程中如果你不手动改变或者释放,它的值会一直存在且不变回复 9# 瘦瓜


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP