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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-08-06 17:07:14

文件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
阅读(2472) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~