免费注册 查看新帖 |

Chinaunix

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

[文本处理] 两个文件对比不同列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-08 09:56 |只看该作者 |倒序浏览
本帖最后由 dashorc 于 2014-05-08 10:34 编辑

cat file1:
1 a b c
2 aa bb cc
3 xxx

cat file2:
1 a b
2 aa bb cc
4 yy zz

请教各位大师,怎么对比两个文件不同的列,最终显示:
file1 1 c
file1 3 xxx
file2 4 yy zz

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-05-08 10:39 |只看该作者
本帖最后由 Herowinter 于 2014-05-08 11:16 编辑

回复 1# dashorc
我刚写完,难度又加了。
如果file1中有一行 1 a b c
file2中                   1 a b d
最后结果 file1 1 c file2 1 d?
   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2014-05-08 11:03 |只看该作者
回复 1# dashorc
加文件名貌似不好搞,今天有事忙,
发个前面没文件名的代码。
  1. awk 'function findDiff(a,b,c){for(i in a)if(!(i in b)){split(i,tmp," ");c[tmp[1]]=c[tmp[1]]?c[tmp[1]]" "tmp[2]:tmp[2]}} {l=split($0,tmp," ")} NR==FNR{for(i=2;i<=l;i++)a[tmp[1]" "tmp[i]];next} {for(i=2;i<=l;i++)b[tmp[1]" "tmp[i]]} END{findDiff(a,b,c);findDiff(b,a,c);for(i in c)print i,c[i]}' file1 file2|sort -n -k1
  2. 1 c
  3. 3 xxx
  4. 4 yy zz
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-05-08 11:15 |只看该作者
回复 2# Herowinter


    是的Herowinter哥

论坛徽章:
0
5 [报告]
发表于 2014-05-08 11:16 |只看该作者
回复 3# Herowinter

好复杂,我消化一下,谢谢大师


   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-05-08 11:29 |只看该作者
本帖最后由 Herowinter 于 2014-05-08 12:07 编辑

回复 5# dashorc
改进了下,这样。
  1. awk 'function findDiff(a,b,c,f){for(i in a)if(!(i in b)){split(i,tmp," ");c[f" "tmp[1]]=c[f" "tmp[1]]?c[f" "tmp[1]]" "tmp[2]:tmp[2]}} {l=split($0,tmp," ")} NR==FNR{for(i=2;i<=l;i++)a[tmp[1]" "tmp[i]];if(FNR==1)f1=FILENAME;next} {for(i=2;i<=l;i++)b[tmp[1]" "tmp[i]];if(FNR==1)f2=FILENAME} END{findDiff(a,b,c,f1);findDiff(b,a,c,f2);for(i in c)print i,c[i]}' file1 file2|sort -k1
  2. file1 1 c
  3. file1 3 xxx
  4. file2 4 yy zz
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
7 [报告]
发表于 2014-05-08 12:15 |只看该作者
这样比较难,再多加几列呢,又有复杂的出现。

awk处理列比较弱

论坛徽章:
0
8 [报告]
发表于 2014-05-08 13:12 |只看该作者
回复 6# Herowinter


   大师给力,awk数组处理效率比我用for循环一个个判断高了N倍,并且一步到位

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2014-05-09 00:54 |只看该作者
本帖最后由 yestreenstars 于 2014-05-09 01:16 编辑
  1. $ awk 'ARGIND%2{if(FNR==1)delete a;for(i=1;i++<NF;)a[$1" "$i];next}{for(i=1;i++<NF;)if($1" "$i in a)$i="";$0=FILENAME" "$0;$1=$1}NF>2' file2 file1 file1 file2
  2. file1 1 c
  3. file1 3 xxx
  4. file2 4 yy zz
复制代码

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
10 [报告]
发表于 2014-05-09 09:55 |只看该作者
回复 9# yestreenstars
这思路真赞,学习了。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP