Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1065937
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类:

2011-09-21 10:59:04

文件a:
WY91u_0963_A0458_2
WY91u_0963_A0458_3
WY91u_0963_A0458_9
文件b:
WY91u_0963_A0458_3
WY91u_0963_A0458_4
WY91u_0963_A0458_4
WY91u_0963_A0458_9
WY91u_0963_A0458_3
文件c:
WY91u_0963_A0458_3
WY91u_0963_A0458_4
WY91u_0963_A0458_4
WY91u_0963_A0458_3
WY91u_0963_A0458_9
WY91u_0963_A0458_3
WY91u_0963_A0458_7
 
找出这3个文本中共有的数据:
WY91u_0963_A0458_9
WY91u_0963_A0458_3

 
  1. # 流程代码
  2. awk '!b[$1,ARGIND]++{a[$1]++}END{for(i in a){if(a[i]==ARGIND)print i}}' a b c

  3. # 优化代码
  4. awk '!b[$1,ARGIND]++{if(++a[$1]==ARGC-1)print}' a b c
[解析]
  最起初一看,觉得这个题没什么难度,写代码的时候才发觉这个题不是想的那么简单。首先大家平常的思路肯定就是先拿a和b比较,然后再拿这个结果去和c比较,假如说比较10个文本,那么代码就要敲10个文本的,假如是100呢?不敢想像。
  言归正传,思路是把每个文本的内容用数组去重后如果值是等于ARGIND的,就输出,这里的ARGIND是gawk的变量,如果是3个文本那么它的值到最后就是3,如果数组去重后的值是等于3的,那么就证明3个文本里都有它嘛,就输出。这里我们用 ARGC-1 来代替3,感谢ziyunfei的思路和指导。优化代码的思路大家理解了第一段代码后就更容易理解了。
  如果在3个文件中有相互重复的内容,而每个文件内并没有重复的内容的话那么可以用下面的命令:
  1. awk '++a[$1]==3' a b c
阅读(1542) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~