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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-08-10 21:29:48

文件a:
123456,abc@test.com,105
654321,abc@test.com,205
111111,hhh@163.com,200
888888,test1@test1.com,500
999999,test2@test2.com,100
144999,test2@test4.com,50
 
文件b:
123456,abc@test.com,105   
654321,abc@test.com,205
111111,hhh@163.com,300
144888,test1@test3.com,800
888888,test1@test1.com,500
999999,test2@test2.com,300

以第1,2字段为参照,用B文件的那一行的第3段去减A文件中也存在的那一行的第3段,然后输出结果(相减结果为0则不输出),如果A文件中唯一的行直接输出,B文件里唯一的行也直接输出,并在后面标记,输出结果:
111111,hhh@163.com,100
144888,test1@test3.com,800 Bfile
999999,test2@test2.com,200
144999,test2@test4.com,50  Afile
 
 
  1. awk -F, 'NR==FNR{a[$1","$2]=$3;next}{n=$1","$2;if(n in a){if(i=$3-a[n])print n","i;delete a[n]}else{print $0" Bfile"}}END{for(i in a)print i","a[i]" Afile"}' a b

[解析]

  先把a文件以第1、2个字段为小标把第3字段的值存入数组a里,然后从b文件的第一行开始判断,如果存在于数组a中,并且相减的值不等于0则打印该行的第1、2字段和相减后的差,这是最关键的一步:然后把该下标从数组a中剔除,如果不存在数组a中,那表明b文件里这行是唯一的,则直接输出该行并做好标记,这样到最后b文件中存在于a文件中的下标就剔除完了,那么数组a中还存在的下标就是b文件中不存在的了,那就达到了输出a文件中唯一行的目的,最后在END中打印出这些b文件中不包含的行,并最好标记。在高版本的awk中"delete a"是清空全部下标,"delete a[i]"是剔除某一个下标。

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

expert12011-08-11 18:09:03

还可以做个标记if (n in a)...设置m[n]=1,END部分判断if (!a)打印。其实delete更好一些