Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2969140
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-18 15:44:47

  1. $ cat a
  2. 1 a
  3. 2 f
  4. 3 5
  5. 4 8
  6. $ cat b
  7. 1 a
  8. 2 f
  9. 3 5
  10. 5 8

有这么两个文本,要求以文本a的第一个字段为比较,如果文本b的第一个字段与a不符合,那么打印出该行。

 

  1. awk 'NR==FNR{a[$1];next}!($1 in a)' a b
  2. 5 8

[解析]

  首先NR==FNR对文本a进行处理,把$1的值作为下标放入数组a,next不会执行后面的语句,一直读到文本b不满足NR==FNR条件,这时判断文本b的$1是否存在于数组a中的下标中,显然文本b的第一行的$1是存在于数组a的下标中的,那么条件为真,再!,注意非真即为假,为假那么不会执行该pattern后面默认的{print]这个action动作,那么则不会输出该行,一直到第4行的$1并未存在于数组a的下标中,那么条件为假,非假为真,则执行默认的打印,输出了该行。或许下面的写法更符合规范和便于理解:

  1. awk 'NR==FNR{a[$1];next}{if(!($1 in a))print $0}' a b

 

    还有没有更简单的方法呢?有的,呵呵,利用pattern的特性,我写出了下面的语句,更短:

  1. awk 'NR==FNR{a[$1]=1;next}!a[$1]' a b

[解析]

  给该数组赋予一个值为1,如果文本b的$1存在数组a中,那么数组a的值则为1,非真为假,则不输出,如果不存在数字a中,那么数组a的值是为0的,非假为真,则打印。

阅读(11127) | 评论(2) | 转发(2) |
给主人留下些什么吧!~~

li09242013-09-13 14:34:22

cat a a b|sort|uniq -u
效率是差了很多!但还是可以理解的!

yestreenstars2012-12-31 16:22:34

awk 'NR==FNR{a[$1]++}!a[$1]' a b更短