免费注册 查看新帖 |

Chinaunix

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

[文本处理] 两文件数值范围对比 [复制链接]

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

文件1:
  1. A 1 5
  2. B 2 4
  3. C 1 6
  4. D 3 7
  5. E 4 9
复制代码
文件2:
  1. 1 2
  2. 3 5
  3. 4 6
  4. 7 12
复制代码
文件1有3列,第1列为标示,第2列为起始值,第3列为终止值。
文件2有2列,第2列为起始值,第2列为终止值。

要求对文件2与文件1进行对比,如果文件1起始值到终止值之间有介于文件2中的,则输出文件2和对应标示。
两文件对比输出结果:
1 2 A  B  C
3 5 E  A  B  C  D
4 6 E  A  B  C  D
7 12 E  D

论坛徽章:
0
2 [报告]
发表于 2013-03-08 10:09 |只看该作者
自己写了一个,输出结果有好多重复的
  1. awk '
  2. NR==FNR{
  3. a[id1++]=$0;
  4. b[id2++]=$3;
  5. d[id3++]=$5;
  6. next;
  7. }
  8. {
  9.    for( i in b )
  10.     {
  11.      for(j=b[i];j<=d[i];j++)
  12.       {
  13.        if(j>=$1&&j<=$2)
  14.        print $0 ,"| "a[i]
  15.       }
  16.      }
  17. }' f1 f2
复制代码

论坛徽章:
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
3 [报告]
发表于 2013-03-08 10:22 |只看该作者
完全搞不懂的你的结果是怎么来的~

论坛徽章:
0
4 [报告]
发表于 2013-03-08 10:43 |只看该作者
回复 3# yestreenstars


     这样出来的 :
  1. awk '
  2. NR==FNR{
  3. a[id1++]=$1;
  4. b[id2++]=$2;
  5. d[id3++]=$3;
  6. next;
  7. }
  8. {
  9.    for( i in b )
  10.     {
  11.      for(j=b[i];j<=d[i];j++)
  12.       {
  13.        if(j>=$1&&j<=$2)
  14.        print $0 ,"   "a[i]
  15.       }
  16.      }
  17. }' f1 f2 |
  18. uniq -c  |
  19. awk '{
  20. a[$2" "$3]=a[$2" "$3]?a[$2" "$3]"  "$4:$4
  21. }
  22. END{
  23. for(i=0;i++<asorti(a,b);)print b[i],a[b[i]]
  24. }'  | sort -k1g  
复制代码

论坛徽章:
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
5 [报告]
发表于 2013-03-08 10:48 |只看该作者
本帖最后由 yestreenstars 于 2013-03-08 11:00 编辑

@dahaoshanhe
已经修改好了~
你原来的主题的结果是有问题的,现在的结果还差不多,符合题意~
  1. awk 'NR==FNR{a[NR]=$1;b[NR]=$2;c[NR]=$3;next}{for(i=1;i<=length(a);i++)for(j=b[i];j<=c[i];j++)if(j>=$1&&j<=$2){t=t?t" "a[i]:a[i];break}print $0"\t"t;t=""}'
复制代码
测试:
  1. [root@localhost ~]# cat a
  2. A 1 5
  3. B 2 4
  4. C 1 6
  5. D 3 7
  6. E 4 9
  7. [root@localhost ~]# cat b
  8. 1 2
  9. 3 5
  10. 4 6
  11. 7 12
  12. [root@localhost ~]# awk 'NR==FNR{a[NR]=$1;b[NR]=$2;c[NR]=$3;next}{for(i=1;i<=length(a);i++)for(j=b[i];j<=c[i];j++)if(j>=$1&&j<=$2){t=t?t" "a[i]:a[i];break}print $0"\t"t;t=""}' a b
  13. 1 2     A B C
  14. 3 5     A B C D E
  15. 4 6     A B C D E
  16. 7 12    D E
  17. [root@localhost ~]#
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2013-03-08 11:02 |只看该作者
try:
  1. awk 'NR==FNR{a[$1]=$2;b[$1]=$3}NR>FNR{printf $0"\t";for(i in a)if(a[i]<=$2&&b[i]>=$1)printf " "i;print ""}' f1 f2
复制代码

论坛徽章:
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
7 [报告]
发表于 2013-03-08 11:11 |只看该作者
回复 6# ly5066113


    膜拜~

论坛徽章:
0
8 [报告]
发表于 2013-03-08 15:08 |只看该作者
回复 6# ly5066113


    if(a<=$2&&b>=$1)   哇 你很聪明~ 

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
9 [报告]
发表于 2013-03-08 15:23 |只看该作者
开个玩笑,不要当真:
  1. [seesea@UC ~]$ while read line; do echo "$line $(grep -E "$(eval "echo {${line/ /..}} | tr ' ' '|'")" <(sed -r 's/([0-9]) ([0-9])/{\1..\2}/; s/^/echo /e' 1.txt) | cut -d' ' -f1 | tr '\n' ' ')"; done < 2.txt
  2. 1 2 A B C
  3. 3 5 A B C D E
  4. 4 6 A B C D E
  5. 7 12 D E
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP