Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26388
  • 博文数量: 3
  • 博客积分: 84
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-12 16:02
文章分类
文章存档

2011年(3)

分类:

2011-08-11 09:06:58

原文地址:awk之删除数组下标 作者:zooyo

文件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]"是剔除某一个下标。

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