免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于文本内容合并 [复制链接]

论坛徽章:
0
发表于 2016-05-08 19:39 |显示全部楼层
按照第二列范围压缩显示

cat file:
111 1
111 2
333 7
222 6
222 9
111 3
222 10
333 3
333 4
333 5
333 6

result:
111 1-3
222 6-6
222 9-10
333 3-7

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2016-05-08 21:21 |显示全部楼层
本帖最后由 haooooaaa 于 2016-05-09 21:52 编辑

已更改, 需要 awk 4.0
  1. awk '{a[$1][$2]=$2}END{for(i in a){s=asort(a[i],b);f=e=b[1];for(j=2;j<=s;j++){if(b[j]-1==e)e=b[j];else{print i,f"-"e;f =e=b[j]}}print i,f"-"e}}'
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-05-08 22:57 |显示全部楼层
回复 1# dahaoshanhe
你试下,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Join{
  5.     my $sID = shift;
  6.     if (@_ > 1){
  7.         printf ("%s %s\n",$sID,join ("-", @_[0, -1]));
  8.     }else{
  9.         printf ("%s %s\n",$sID, join ("-", $_[0], $_[0]));
  10.     }
  11. }

  12. my @aData;
  13. foreach (`sort -t" " -k1,1n -k2,2n f`){
  14.     my @aList = split;
  15.     if (!@aData){
  16.         @aData = @aList;
  17.         next;
  18.     }
  19.     if ($aData[0] == $aList[0]){
  20.         if ($aData[-1] + 1 == $aList[-1]){
  21.             push (@aData, $aList[-1]);
  22.         }else{
  23.             Join (@aData);
  24.             $#aData = 0;
  25.             push (@aData, $aList[-1]);
  26.         }
  27.         next;
  28.     }
  29.     Join (@aData);
  30.     @aData = @aList;
  31. }
  32. Join (@aData);
复制代码
111 1-3
222 6-6
222 9-10
333 3-7

   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-05-09 00:08 |显示全部楼层
把 Join 函数精简了下:
  1. sub Join{
  2.     printf ("%s %s\n",$_[0], join ("-", @_[1, -1]));
  3. }
复制代码

论坛徽章:
0
发表于 2016-05-09 06:56 |显示全部楼层
回复 2# haooooaaa


    你这是在哪个版本的AWK上运行的,我的版本不识别这样的写法

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
发表于 2016-05-09 09:16 |显示全部楼层
  1. awk '{a[$1]=a[$1] $2 FS}END{for(i in a){l=split(a[i],b);asort(b);printf i FS b[1]"-";for(k=2;k<=l;++k){if(b[k]!=b[k-1]+1)printf b[k-1]"\n"i FS b[k]"-"};printf b[k-1]"\n"}}'
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
dahaoshanhe + 10

查看全部评分

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
发表于 2016-05-09 09:39 |显示全部楼层
sort -n -k2,2 file|awk '{a[$1]=a[$1]" "$2}END{for(i in a)print i,a[i]}'|awk '{print $1,$2"-"$NF}'
111 1-3
222 6-10
333 3-7

论坛徽章:
0
发表于 2016-05-09 10:02 |显示全部楼层
回复 7# jcdiy0601


    我和你的思路一样,只是SORT伤不起啊,有2亿多行记录,效率不高。

求职 : 技术支持/维
论坛徽章:
0
发表于 2016-05-09 10:04 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-05-09 10:36 |显示全部楼层
回复 5# dahaoshanhe

$ awk 'function xsort(v,s ,t,n,e){split(s,c," ");t=asort(c);e=c[1];printf ("%s %d-",v,e);for(n=2;n<=t;++n){if(c[n]-e-1)printf("%d\n%s %d-",e,v,c[n]);e=c[n]}print e}{a[$1]=a[$1]$2" "}END{t=asorti(a,b);for(n=1;n<=t;++n){xsort(b[n],a[b[n]])}}' file
111 1-3
222 6-6
222 9-10
333 3-7

   

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 向大神学习, 天天向上!!!

查看全部评分

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP