免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2867 | 回复: 12

[求助]对比两个make命令的选项 [复制链接]

论坛徽章:
0
发表于 2010-01-20 09:50 |显示全部楼层
有make命令,其中包括了N多选项,其格式如下:
make [OPTION_1]=[Value_1] [OPTION_2]=[Value_2] ...... [OPTION_n]=[Value_n]


例如有如下两个make命令,可以认为这是存在与两个不同文件中的:
make USE_AAA=yes USE_BBB=no USE_CC.09=yes

make USE_AAA=yes USE_BWB=no USE_CC.09=no


我想得到的结果最少要能把相同的选项过滤掉,例如上面的例子在结果中就不要有USE_AAA=yes了。
更好一点的话,可以在结果中显示出在两者不同的选项中,哪些是选项名不同(例如:USE_BWB 和 USE_BBB),哪些是选项名相同但值不同(例如USE_CC.09=yes与USE_CC.09=no)。

请大家给些指点,谢谢。

ps. 我最初想法是用vimdiff这两个文件,但这些选项都在同一行,导致结果用眼无法识别

[ 本帖最后由 Suchangyu 于 2010-1-20 11:19 编辑 ]

论坛徽章:
0
发表于 2010-01-21 10:38 |显示全部楼层
这个问题提得真好~

论坛徽章:
0
发表于 2010-01-21 10:49 |显示全部楼层
看到1楼和2楼的自我对话 我感到很无助

论坛徽章:
0
发表于 2010-01-21 11:23 |显示全部楼层
现在的人都越来越有才啦,比如我。

恩,就是这样。

论坛徽章:
0
发表于 2010-01-21 11:25 |显示全部楼层

回复 #3 nigelrax 的帖子

同感 呵呵

论坛徽章:
30
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3719周年集字徽章-19
日期:2019-08-27 13:31:2619周年集字徽章-CU
日期:2019-09-08 23:26:25
发表于 2010-01-21 14:10 |显示全部楼层

回复 #2 Suchangyu 的帖子

马甲切换失败?
下次一个用IE一个用Firefox吧

论坛徽章:
0
发表于 2010-02-12 15:24 |显示全部楼层
看到1楼和2楼的自我对话 我感到很无助
nigelrax 发表于 2010-01-21 10:49



    大家不管,我只好自己来了。这几天看了下官方手册,写个了基本可用的脚本。

  1. BEGIN {
  2.     while((getline < "make_1")>0) {
  3.         for(i=2;i<=NF;i++) {
  4.             if(split($i,tmp_array,"=") == 2){
  5.                 # assign the name-value pair in array
  6.                 source_option[tmp_array[1]]=tmp_array[2];
  7.                 source_option_hit[tmp_array[1]]=0;
  8.             }
  9.         }
  10.     }
  11. }
  12. {
  13.     for(i=2;i<=NF;i++) {
  14.         if(split($i,tmp_array,"=") == 2){
  15.             if(tmp_array[1] in source_option) {
  16.                 source_option_hit[tmp_array[1]]=1;
  17.                 if(tmp_array[2] != source_option[tmp_array[1]])
  18.                     result_new_value=result_new_value"\n"tmp_array[1]":"tmp_array[2]" <-> "so\
  19. urce_option[tmp_array[1]];
  20.             }
  21.             else
  22.                 result_new_option=result_new_option"\n"$i" [make_1]";
  23.         }
  24.     }
  25. }
  26. END {
  27.     print "====== result_new_option ======="result_new_option;
  28.     for( i in source_option ) {
  29.         if(source_option_hit[i]==0)
  30.             print i"="source_option[i]"[make_2]";
  31.     }
  32.     print "";
  33.     print "====== result_new_value ======="result_new_value;
  34. }

复制代码
使用如下:
[suchangyu@localhost work]$cat make_1
make USE_AAA=yes USE_BBB=no USE_CC.09=yes
[suchangyu@localhost work]$cat make_2
make USE_AAA=yes USE_BWB=no USE_CC.09=no
[suchangyu@localhost work]$awk -f diffmakeoption.awk make_2

论坛徽章:
0
发表于 2010-02-12 15:38 |显示全部楼层
make USE_AAA=yes USE_BBB=no USE_CC.09=yes

make USE_AAA=yes USE_BWB=no USE_CC.09=no
更好一点的话,可以在结果中显示出在两者不同的选项中,哪些是选项名不同(例如:USE_BWB 和 USE_BBB),哪些是选项名相同但值不同(例如USE_CC.09=yes与USE_CC.09=no)。
Suchangyu 发表于 2010-01-20 09:50


你的意思这两个make是按顺序对应的喽?要不USE_BWB=no也可以跟USE_CC.09=yes去比较

论坛徽章:
0
发表于 2010-02-12 16:13 |显示全部楼层
本帖最后由 ywlscpl 于 2010-02-12 16:51 编辑
  1. awk 'BEGIN{new_o="====== result_new_option =======";new_v="====== result_new_value ======="}NR==FNR{for (i=2;i<=NF;i++) {split($i,m,"=");a[m[1]]=m[2];c[i]=m[1]}num=NF}NR>FNR{for (i=2;i<=NF;i++) {split($i,n,"=");b[n[1]]=n[2];if (!(n[1] in a)) new_o=new_o"\noption "i-1":\t"$i"\t"ARGV[2];else if (a[n[1]]!=n[2]) new_v=new_v"\noption "i-1":\t"$i"("ARGV[2]") "a[n[1]]"("ARGV[1]")"}}END{for (i=2;i<=num;i++) if (!(c[i] in b)) new_o=new_o"\noption "i-1":\t"c[i]"="a[c[i]]"\t"ARGV[1];print new_o"\n"new_v}' make_1 make_2
复制代码

论坛徽章:
0
发表于 2010-02-12 20:25 |显示全部楼层
太强了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP