文件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
- 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]"是剔除某一个下标。
阅读(4351) | 评论(1) | 转发(1) |