免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-29 11:02 |只看该作者 |倒序浏览
各位大牛好,感谢各位大牛点进帖子来看我的问题

语句:awk 'FNR==NR{a[$0];next}!($2 in a)' b.txt a.txt


问题:经常看到awk语句中有  a[$0];next  和 ($2 in a ) 两个字段,不理解,能否通俗的解释下?
         在CU的 shell基础九:awk 篇中也没有看到,特来请教,谢谢!



论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
2 [报告]
发表于 2013-07-29 11:29 |只看该作者
  1. a[$0],就是把$0作为数组a的键
  2. next,就是跳过前面的FNR==NR{a[$0]}去执行后面的!{$2 in a}
  3. $2 in a,就是如果查找数组a的键是否包含有$2
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
3 [报告]
发表于 2013-07-29 11:50 |只看该作者
本帖最后由 wenhq 于 2013-07-29 11:50 编辑

next是停止执行后面的语句,然后取下一行内容从头执行。

论坛徽章:
0
4 [报告]
发表于 2013-07-29 14:57 |只看该作者
回复 2# 代号:军刀


我看多看看例子,3Q

   

论坛徽章:
0
5 [报告]
发表于 2013-07-29 14:58 |只看该作者
回复 3# wenhq


    我在多看看例子,谢谢

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
6 [报告]
发表于 2013-08-01 14:52 |只看该作者
本帖最后由 rdcwayx 于 2013-08-01 16:53 编辑

回复 1# Linux_JinYuan

可能写成这样更容易理解。
  1. awk 'FNR==NR{a[$0]}                           # 将第一个文件内容读到数组里。
  2.        NR>FNR !($2 in a)' b.txt a.txt          # 对第二个文件比较,输出需要的结果。
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-08-01 15:40 |只看该作者
还不是很明白,这条命令可以实现什么样的功能

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
8 [报告]
发表于 2013-08-01 15:58 |只看该作者
回复 7# justlucifer


打开sed&awk,看看第307页。

O'Reilly sed & awk 2nd Edition 英文版
http://bbs.chinaunix.net/viewthread.php?tid=1588614#pid11286082

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
9 [报告]
发表于 2013-08-01 16:37 |只看该作者
IT'S SO HARD   

论坛徽章:
0
10 [报告]
发表于 2013-08-01 16:48 |只看该作者
本帖最后由 justlucifer 于 2013-08-01 16:51 编辑

谢谢楼上大神推荐的书,我看明白这个命令的意思了。
假设,b.txt内容如下
a
b
c
a.txt内容如下
2 a
3 b
4 c
5 d
FNR是file number of record,就是文件的行记录数,NR是number of record,是AWK的行记录数,FNR==NR的意思是awk在处理第一个文件的时候,a[$0];next 的意思是以一行做为a[]数组的一个下标,next就是跳出这个行,执行下一行。
FNR==NR{a[$0];next}命令的执行结果就是
a[a]=0,a=0,a[c]=0.
FNR==NR不成立后,{a[$0];next}不再执行,执行!($2 in a),FNR==NR不成立就是说处理到a.txt这个文件了,$2是第二列的值,$2 in a的意思,第二列的值知否在a数组的下标中,如果在,$2 in a为真,!($2 in a)就为假。当!($2 in a)为真,就执行默认的print $0,打印出a.txt的这一行。
所以,awk 'FNR==NR{a[$0];next}!($2 in a)' b.txt a.txt的执行结果为:
5 d

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP