Chinaunix首页 | 论坛 | 博客
  • 博客访问: 56749
  • 博文数量: 28
  • 博客积分: 84
  • 博客等级: 民兵
  • 技术积分: 162
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 17:47
个人简介

try vuuv.github.io or somewhere else.

文章分类

全部博文(28)

文章存档

2013年(1)

2012年(5)

2011年(22)

我的朋友

分类:

2011-10-07 15:01:37

原文地址:awk之in的运用实例 作者:zooyo

  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的,非假为真,则打印。

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