文件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
- # 流程代码
- awk '!b[$1,ARGIND]++{a[$1]++}END{for(i in a){if(a[i]==ARGIND)print i}}' a b c
- # 优化代码
- 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个文件中有相互重复的内容,而每个文件内并没有重复的内容的话那么可以用下面的命令:
阅读(2459) | 评论(0) | 转发(2) |