免费注册 查看新帖 |

Chinaunix

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

[已解决] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-13 11:51 |只看该作者 |倒序浏览
[i=s] 本帖最后由 cynthiajinan 于 2010-06-10 10:26 编辑 [/i]

假如有一个文件1.txt里面有两列:
a11 a12
a21 a22
a31 a32
............
an1 an2
另一个文件2.txt里面有1列:
b1
b2
b3
...
bm

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2009-12-13 11:57 |只看该作者
while loop

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2009-12-13 12:05 |只看该作者

  1. awk 'BEGIN{a[""]=1;}NR==FNR{a[$1]=1;}NR!=FNR{if(a[$1]!=1&&a[$2]!=1){print "1";exit}}END{print "0"}'  2.txt 1.txt
复制代码

论坛徽章:
0
4 [报告]
发表于 2009-12-13 12:06 |只看该作者
能不能详细一点呀?我是新手,不知道怎么实现判断一行里面2个值同时属于另一个文件。多谢了。

论坛徽章:
0
5 [报告]
发表于 2009-12-13 12:09 |只看该作者
多谢cjaizss,下午我到环境上试试。

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
6 [报告]
发表于 2009-12-13 15:31 |只看该作者

回复 #3 cjaizss 的帖子

能不能详细介绍下这条命令的意思?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2009-12-13 15:43 |只看该作者
原帖由 nxlinux 于 2009-12-13 15:31 发表
能不能详细介绍下这条命令的意思?

NR==FNR是用来标志第一个文件的,NR!=FNR是用来标志第二个文件的
当第一个文件被扫描之后,第一个文件里所有的内容都在数组a里,而其没有的内容都不在数组a里.
当然,a[""]=1是用来以防有空行之类的东西.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2009-12-13 15:45 |只看该作者
原帖由 cjaizss 于 2009-12-13 15:43 发表

NR==FNR是用来标志第一个文件的,NR!=FNR是用来标志第二个文件的
当第一个文件被扫描之后,第一个文件里所有的内容都在数组a里,而其没有的内容都不在数组a里.
当然,a[""]=1是用来以防有空行之类的东西.

另外,我后面的判断标准是
a[$1]!=1&&a[$2]!=1
如果用
$1 in a && $2 in a
也可

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
9 [报告]
发表于 2009-12-13 16:32 |只看该作者

回复 #7 cjaizss 的帖子

awk 'BEGIN{a[""]=1;}NR==FNR{a[$1]=1;}NR!=FNR{if(a[$1]!=1&&a[$2]!=1){print "1";exit}}END{print "0"}'  2.txt 1.txt

版主你说a[""]=1能防止空行,但是你放到了BEGIN语句里面,我的理解是BEGIN在awk在处理文件之前运行的,,,awk还没有读取数据呢,a[""]=1怎么就处理空行了?(请版主指正)

FNR表示什么意思,NR应该是已读取的行号吧?

NR==FNR{a[$1]=1;}#按照版主你说的,NR==FNR就是说{a[$1]=1;}处理的是2号文件
将2号文件中的所有记录放到数组a里面,并设置1

NR!=FNR{if(a[$1]!=1&&a[$2]!=1){print "1";exit}}#NR!=FNR也就是1号文件了,if(a[$1]!=1&&a[$2]!=1)这里就是判断1号文件中是否在2号文件中存在,如果存在条件就是false,不存在就是true,,,我想知道a[$1]!=1 && a[$2]!=1 判断的这个过程,是怎么处理的,是将1号文件所有的$1和$2进行判断吗?

谢谢版主!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2009-12-13 16:52 |只看该作者
设置数组a是给第二个文件用的,不是给第一个文件用的
对于a[""]=1;
你试想一下,如果不加这一行,而第二个文件中有空行,会出现什么结果?
FNR的意思,你可以去man awk查看一下,只有在awk程序后面可能接多个文件的时候,FNR才有使用的意义
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP