免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1321 | 回复: 4
打印 上一主题 下一主题

处理两个文件 [求助] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-12 20:21 |只看该作者 |倒序浏览
文件如下:
a文件
9|3010630|16885597112|16885597408|||101920|0|168855979408|168855979408|0||16885597|456081004250622|||||0||168855979977408|||8888||168855970202||20090810101920|725|0|||||
9|3090032|16885597608|168855970460|||112614|0|168855979110460|168855979110460|0||16885597|45608100423|||||0||168855979110460|||8888||168855970200002||20090810112614|37|0|||||


b文件
1064649|0|20090812173514|1|85597612|85597908|8888||1688559799408||1|00|168855970200002|50622|||101920|0|0|20090810101920|0|725|0|||0|||168855979977408|1001|3000030|976000112|1|0|20090801|1|0|0|33205|855|97|1|855|97|0|855|97|1|855|97|1|3000030|10000000000000000000|0|0|0|0|1000000|1001079002|2|0|0|0|0|0|0|0|1001079002|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|||||||||||||||||||3||20090801000000||168855970200002|
1064650|0|20090812173514|1|855976018|855979110|8888||16885597960||1|00|168855970202|50673|||112614|0|0|20090810112614|0|37|0|||0|||168855979110460|1001|3000030|976000118|1|0|20090801|1|0|0|4998|855|97|1|855|97|0|855|97|1|855|97|1|0|00000000000000000000|0|0|0|0|2000000|1001079014|2|0|0|0|0|0|0|0|1001079014|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|||||||||||||||||||3||20090801000000||168855970202|

现在要挑选出a文件中在b文件中没有的行。
挑选规则:
要是a的3列去168后等于b的5列 && a的4列去168后等于b的6列 && a的11加上1后等于b的11列 && a的28等于b的20列
则认为这两行为相等的行。
两文件比较大没有列全,只是列了开头几行。

论坛徽章:
0
2 [报告]
发表于 2009-08-12 20:26 |只看该作者
自己写的这个,好像不行,高手帮看看。。
awk -F'|' '{
   if(FILENAME=="a")
   {
     $11+=1;
     ckey1=substr($3,4) "," substr($4,4) "," $11 $28;
     arr1[ckey1]=1
   }
   if(FILENAME=="b")
   {
     akey=$5 "," $6 "," $11 $20;
     if(akey in arr1)
     {
     }
     else
     {
         print $0 >>"miss.unl"
     }
   }
}' a b

论坛徽章:
0
3 [报告]
发表于 2009-08-12 20:56 |只看该作者
awk -F'|' '{
   if(FILENAME=="b")
   {
     ckey1=$5 "," $6 "," $11 $20;
     arr1[ckey1]=1
   }
   if(FILENAME=="a")
   {
     var1=$11+1;
     var2=substr($3,4);
     var3=substr($4,4);
     akey=var2 "," var3 "," var1 $28;
     if(akey in arr1)
     {
     }
     else
     {
         print $0 >>"miss.unl"
     }
   }
}' b a
左弄右弄,这样总算行了

论坛徽章:
0
4 [报告]
发表于 2009-08-12 21:33 |只看该作者
  1. awk -F "|" 'NR==FNR{a["168"$5"#168"$6"#"$11-1"#"$20]}NR>FNR&&!($3"#"$4"#"$11"#"$28 in a)' b a
复制代码

[ 本帖最后由 ywlscpl 于 2009-8-12 21:35 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-08-12 21:52 |只看该作者
原帖由 ywlscpl 于 2009-8-12 21:33 发表
awk -F "|" 'NR==FNR{a["168"$5"#168"$6"#"$11-1"#"$20]}NR>FNR&&!($3"#"$4"#"$11"#"$28 in a)' b a



这个OK,比我的简单。。学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP