忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
123下一页
最近访问板块 发新帖
查看: 2087 | 回复: 29

[文本处理] 如果文件1和文件2的第1列相同,则输出第2列字符串大的那1行 [复制链接]

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
发表于 2018-04-15 23:18 |显示全部楼层
本帖最后由 weichanghe2000 于 2018-04-24 23:49 编辑

大家好,请教大家帮忙写1个shell小脚本,解答下面的问题:
先谢谢了。

问题描述:
比较2个文件1和2,输出文件3:
1 删除文件1和文件2的重复行
2 如果文件1和文件2的第1列相同,则输出第2列字符串大的那1行。
  举例:
  第2列分别是0.1-37 和 0.2-53,则0.2-53大;
       如果  是6.1.4-b.0 和 6.1.5-c.2,则6.1.5-c.2大;
       9.13.2  小于  11.5.6;
       8c-7 小于 18b-16 ;
       D15 小于 F4;
       1.b5_a 小于 1.b12_d。
规则:对于2个文件的第2列:
> 数字0-9连续出现的个数可能不一样,如 9.13.2 和   11.5.6,D15  和 F4
> 其他字符出现的类型(如 . 或 _ 或  - 或 大写字母A-Z 或小写字母a-z),顺序和次数一样,如6.1.4-b.0 和6.1.5-c.2,1.b5_a 和 1.b12_d,D15 和 F4  ....
> 比较得到第1次出现的大的字符后,即停止比较第2列,并输出第2列字符串大的这1行,如IO      1.b5_a ,IO   1.b12_d,则输出 IO      1.b12_d



输入文件1 格式形如:
  1. PK      0.1-37
  2. Art     6.1.4-b.0
  3. Fle     9.13.2   
  4. Uni     18b-16  
  5. STD     D15  
  6. IO      1.b5_a
  7. ....
  8. ....
复制代码


输入文件2 格式形如:
  1. Uni     8c-7
  2. IO      1.b12_d
  3. Art     6.1.5-c.2
  4. PK      0.2-53
  5. Fle     11.5.6
  6. STD     F4
  7. ....
  8. ....
复制代码


输出文件3 格式如下:(输出字符串最大的那一行)
  1. Art     6.1.5-c.2
  2. Fle     11.5.6
  3. IO      1.b12_d
  4. PK      0.2-53
  5. STD     F4
  6. Uni     18b-16  
复制代码



论坛徽章:
38
辰龙
日期:2013-08-21 15:45:19寅虎
日期:2014-06-09 12:52:17双鱼座
日期:2014-06-10 12:42:44巨蟹座
日期:2014-06-12 23:17:17戌狗
日期:2014-06-17 09:53:29未羊
日期:2014-10-10 13:45:41申猴
日期:2015-03-03 17:21:37亥猪
日期:2015-03-03 17:22:002015亚冠之广州富力
日期:2015-05-12 16:34:522015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:08平安夜徽章
日期:2015-12-26 00:06:30
发表于 2018-04-15 23:28 |显示全部楼层
本帖最后由 关阴月飞 于 2018-04-16 14:16 编辑

举例:
  第2列分别是0.1-37 和 0.2-53,则0.2-53大;     
这个好理解,直接就是 - 两边的数字对比

       如果  是6.1.4-b.0 和 6.1.5-c.2,则6.1.5-c.2大;
这个比较的规则是什么?如果是  6.1.4-b.0  和 6.1.5-a.0  呢,哪个大?

       9.13.2  小于  11.5.6;
这个比较的规则又是什么? 里面明明13 大于 11 呀


       8c-7 小于 18b-16 ;
为什么? c不是比b 要大吗?

       D15 小于 F4;
为什么? 同理,15也比4要大呀


重点是:
第二列的字符串  的 大小  是怎么个比较法?  如何确定 这一串字符  比另一串字符 大 ?  比较的规则是什么?  另外,字符串的内容是否有统一的格式?

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
发表于 2018-04-16 18:24 |显示全部楼层
本帖最后由 weichanghe2000 于 2018-04-16 18:28 编辑

回复 2# 关阴月飞

您好,先谢谢您的关注和耐心查看问题哈。我将一一回答:


举例:
  第2列分别是0.1-37 和 0.2-53,则0.2-53大;     
这个好理解,直接就是 - 两边的数字对比
答:因为出现了 0.1<0.2,后面就不再比较37与53了。

       如果  是6.1.4-b.0 和 6.1.5-c.2,则6.1.5-c.2大;
这个比较的规则是什么?如果是  6.1.4-b.0  和 6.1.5-a.0  呢,哪个大?
答:前面其实说了比较规则,按位比较,只要找到第一个大的字符后,就停止比较。但是有可能是数字连续出现的个数不一样,如9.13.2和11.5.6,虽然第1位比较时:9 > 1,但是11.5.6 中 1出现了2次,即11,所以 就是 9.13.2 版本 < 11.5.6。不再比较后面的 13 和 5
所以 6.1.4-b.0<6.1.5-c.2,  6.1.4-b.0 <6.1.5-a.0

       9.13.2  小于  11.5.6;
这个比较的规则又是什么? 里面明明13 大于 11 呀
答:上面已经解释了,因为 9 < 11

       8c-7 小于 18b-16 ;
为什么? c不是比b 要大吗?
答: 上面解释了,唯一的差别是数字出现的个数不一样,这里虽然 第一位比较时,8>1,但是1后面又出现了8,即18,所以 8c-7<18b-16

       D15 小于 F4;
为什么? 同理,15也比4要大呀
答:
第一次比较 时,字符 D的ASCII<F,所以 D15小于F4。
注意,不会出现 D15 与 d15点情况,也不会出现 D15与f4点情况。除了数字出现个数不一样,其他的都是每一位字符类型相同

重点是:
第二列的字符串  的 大小  是怎么个比较法?  如何确定 这一串字符  比另一串字符 大 ?  比较的规则是什么?  另外,字符串的内容是否有统一的格式?

答:
规则就是上面一一回复的哈。

另外,之所以有这个需求,是因为我们是半导体/EDA行业,当EDA工具版本,工艺数据(PDK/STDCELL等)版本命名就是这样的规则和风格。
我们需要一个脚本判断本次vendor通知我们是否更新工具时,我们要先判断,当前我们安装的版本与本次release给我们的版本,哪个更新?如果已经安装的版本旧,则更新,安装新的;如果已经安装的版本要新,release给我们的旧,则不用更新。

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
发表于 2018-04-16 23:16 |显示全部楼层
回复 2# 关阴月飞

您好,先谢谢您的关注和耐心查看问题哈。我将一一回答:

举例:
  第2列分别是0.1-37 和 0.2-53,则0.2-53大;     
这个好理解,直接就是 - 两边的数字对比
答:因为出现了 0.1<0.2,后面就不再比较37与53了。

       如果  是6.1.4-b.0 和 6.1.5-c.2,则6.1.5-c.2大;
这个比较的规则是什么?如果是  6.1.4-b.0  和 6.1.5-a.0  呢,哪个大?
答:前面其实说了比较规则,按位比较,只要找到第一个大的字符后,就停止比较。但是有可能是数字连续出现的个数不一样,如9.13.2和11.5.6,虽然第1位比较时:9 > 1,但是11.5.6 中 1出现了2次,即11,所以 就是 9.13.2 版本 < 11.5.6。不再比较后面的 13 和 5
所以 6.1.4-b.0<6.1.5-c.2,  6.1.4-b.0 <6.1.5-a.0

       9.13.2  小于  11.5.6;
这个比较的规则又是什么? 里面明明13 大于 11 呀
答:上面已经解释了,因为 9 < 11

       8c-7 小于 18b-16 ;
为什么? c不是比b 要大吗?
答: 上面解释了,唯一的差别是数字出现的个数不一样,这里虽然 第一位比较时,8>1,但是1后面又出现了8,即18,所以 8c-7<18b-16

       D15 小于 F4;
为什么? 同理,15也比4要大呀
答:
第一次比较 时,字符 D的ASCII<F,所以 D15小于F4。
注意,不会出现 D15 与 d15点情况,也不会出现 D15与f4点情况。除了数字出现个数不一样,其他的都是每一位字符类型相同

重点是:
第二列的字符串  的 大小  是怎么个比较法?  如何确定 这一串字符  比另一串字符 大 ?  比较的规则是什么?  另外,字符串的内容是否有统一的格式?
答:
规则就是上面一一回复的哈。

另外,之所以有这个需求,是因为我们是半导体/EDA行业,当EDA工具版本,工艺数据(PDK/STDCELL等)版本命名就是这样的规则和风格。
我们需要一个脚本判断本次vendor通知我们是否更新工具时,我们要先判断,当前我们安装的版本与本次release给我们的版本,哪个更新?如果已经安装的版本旧,则更新,安装新的

论坛徽章:
16
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07
发表于 2018-04-17 15:08 |显示全部楼层
本帖最后由 wh7211 于 2018-04-17 15:17 编辑

回复 4# weichanghe2000


  1. awk 'FILENAME==ARGV[1]{a[$1]=$2;next}{c=split(a[$1],b,"[._-]");split($2,d,"[._-]");for(e=1;e<=c;e++){match(b[e],"^([0-9]*)([a-zA-Z]*)([0-9]*)$",f);match(d[e],"^([0-9]*)([a-zA-Z]*)([0-9]*)$",g);for(h=1;h<=3;h++){if(f[h]>g[h]){i[$1]=$1" "a[$1];j=1;break}else if(f[h]<g[h]){i[$1]=$1" "$2;j=1;break}};if(j){j=0;break}}}END{l=asorti(i,k);for(m=1;m<=l;m++){print i[k[m]]}}' 1 2
  2. Art 6.1.5-c.2
  3. Fle 11.5.6
  4. IO 1.b12_d
  5. PK 0.2-53
  6. STD F4
  7. Uni 18b-16
复制代码

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
发表于 2018-04-20 00:08 |显示全部楼层
回复 5# wh7211

非常感谢您。

这几天一直在忙于别的事情。
还没有来得及看。

如果有疑问,再向您请教哈。

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
发表于 2018-04-30 00:32 |显示全部楼层
回复 5# wh7211

您好,我的redhat 5.8,awk 版本是GNU 3.1.5,结果跟您的不一致哦?
这个是什么原因呢。

sort.png

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
发表于 2018-05-01 09:56 |显示全部楼层
本帖最后由 1cpuer 于 2018-05-01 09:57 编辑

回复 5# wh7211

match(b[e],"^([0-9]*)([a-zA-Z]*)([0-9]*)$",f)
if(f[h]>g[h]){i[$1]=$1" "a[$1];
f 指的是啥?

论坛徽章:
16
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07
发表于 2018-05-02 15:16 |显示全部楼层
本帖最后由 wh7211 于 2018-05-02 15:21 编辑

回复 7# weichanghe2000


  1. awk 'FILENAME==ARGV[1]{a[$1]=$2;next}{c=split(a[$1],b,"[._-]");split($2,d,"[._-]");for(e=1;e<=c;e++){match(b[e],"^([0-9]*)([a-zA-Z]*)([0-9]*)$",f);match(d[e],"^([0-9]*)([a-zA-Z]*)([0-9]*)$",g);for(h=1;h<=3;h++){f[h]=f[h]~"[0-9]"?f[h]+0:f[h];g[h]=g[h]~"[0-9]"?g[h]+0:g[h];if(f[h]>g[h]){i[$1]=$1" "a[$1];j=1;break}else if(f[h]<g[h]){i[$1]=$1" "$2;j=1;break}};if(j){j=0;break}}}END{l=asorti(i,k);for(m=1;m<=l;m++){print i[k[m]]}}' 1 2
复制代码

论坛徽章:
16
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07
发表于 2018-05-02 16:05 |显示全部楼层
本帖最后由 wh7211 于 2018-05-02 16:06 编辑

回复 8# 1cpuer


f和g是数组,用于数字或字符串比较。处理文件2时:

<<<处理a[$1],即『IO 1.b5_a』
e==1 -> b[e]==b[1]=="1" -> f[1]=="1",f[2]=="",f[3]==""
e==2 -> b[e]==b[2]=="b5" -> f[1]=="",f[2]=="b",f[3]=="5"
e==3 -> b[e]==b[3]=="a" -> f[1]=="",f[2]=="a",f[3]==""

<<<处理$2,即『IO 1.b12_d』
e==1 -> d[e]==d[1]=="1" -> g[1]=="1",g[2]=="",g[3]==""
e==2 -> d[e]==d[2]=="b12" -> g[1]=="",g[2]=="b",g[3]=="12"
e==3 -> d[e]==d[3]=="d" -> g[1]=="",g[2]=="d",g[3]==""

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP