免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 判断每行的前18个字符否是连续的数字行 [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之北控
日期:2016-06-06 21:01:08程序设计版块每日发帖之星
日期:2016-06-19 06:20:00程序设计版块每日发帖之星
日期:2016-07-17 06:20:00
发表于 2016-11-20 17:16 |显示全部楼层
需求:在ufile文件中,每行有19个字符数,判断每行前18个字符数与一下行前18个字符数,是否是连续数字的行,
如果是连续的行,则打印出连续行的起始行(带上最后一位字符,共19位字符)和连续行的末尾行(带上最后一位字符,共19位字符),之间用"-"分割;各段之间用"\n"分割(换行);
反之,则直接打印该行字符(19位)。

源文件:(例子中只截取了26行,带行号)
[root@www src]# nl ufile
     1        6200374842000114051
     2        6200374842000114069
     3        6200374842000114077
     4        6200374842000114101
     5        6200374842000114119
     6        6200374842000114127
     7        6200374842000114135
     8        6200374842000114150
     9        6200374842000114168
    10        6200374842000114176
    11        6200374842000114184
    12        6200374842000114200
    13        6200374842000114218
    14        6200374842000114234
    15        6200374842000114242
    16        6200374842000114259
    17        6200374842000114275
    18        6200374842000114283
    19        6200374842000114291
    20        6200374842000114309
    21        6200374842000114317
    22        6200374842000114325
    23        6200374842000114333
    24        6200374842000114341
    25        6200374842000114358
    26  6200374842000114389

结果:
6200374842000114051-6200374842000114077
6200374842000114101-6200374842000114135
6200374842000114150-6200374842000114184
6200374842000114200-6200374842000114218
6200374842000114234-6200374842000114259
6200374842000114275-6200374842000114358
6200374842000114389

论坛徽章:
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-11-20 19:37 |显示全部楼层
如何理解这个连续数字的行,文中这些记录不都是连续的数字吗?

论坛徽章:
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-11-20 22:29 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $R = qr /((.*).)/;
  5. my ($n, @aData);
  6. while (<DATA>){
  7.     (undef, local $_) = split;
  8.     if (!@aData){
  9.         @aData = /$R/;
  10.         next;
  11.     }

  12.     $n++;
  13.     if (/$R/ and $2 == $aData[1] + $n){
  14.         $aData[2] = $1;
  15.         next;
  16.     }
  17.     print "$aData[0]-$aData[-1]\n";
  18.     @aData = /$R/;
  19.     $n = 0;
  20. }

  21. print $aData[0], @aData == 3 ? "-$aData[-1]" : "", "\n";
  22. __DATA__
  23. 1        6200374842000114051
  24. 2        6200374842000114069
  25. 3        6200374842000114077
  26. 4        6200374842000114101
  27. 5        6200374842000114119
  28. 6        6200374842000114127
  29. 7        6200374842000114135
  30. 8        6200374842000114150
  31. 9        6200374842000114168
  32. 10        6200374842000114176
  33. 11        6200374842000114184
  34. 12        6200374842000114200
  35. 13        6200374842000114218
  36. 14        6200374842000114234
  37. 15        6200374842000114242
  38. 16        6200374842000114259
  39. 17        6200374842000114275
  40. 18        6200374842000114283
  41. 19        6200374842000114291
  42. 20        6200374842000114309
  43. 21        6200374842000114317
  44. 22        6200374842000114325
  45. 23        6200374842000114333
  46. 24        6200374842000114341
  47. 25        6200374842000114358
  48. 26  6200374842000114389
复制代码

论坛徽章:
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-11-20 22:37 |显示全部楼层
回复 3# ll104567
那就来一个?!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2016-11-20 23:21 |显示全部楼层
awk -M -vFIELDWIDTHS="18 1" '{if($1==ss+1){p=1}else{if(p){p=0;printf "-"ss b RS $1 $2}else{printf (NR==1?"":",")$1 $2}}}{ss=$1;b=$2}'

论坛徽章:
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-11-21 01:14 |显示全部楼层
本帖最后由 jason680 于 2016-11-21 01:17 编辑

回复 1# 18800375280

$ awk 'function d1(p,n){return (substr(p,1,9)==substr(n,1,9)&&substr(p,10,9)+1==substr(n,10,9))}function x(){if(s!=p)print c P;printf $1;c="-";s=p=n;P=$1;next}{n=substr($1,1,18);if(s=="")x();if(d1(p,n)){p=n;P=$1;next}x()}END{print (s!=p)?c P:""}' ufile
6200374842000114051-6200374842000114077
6200374842000114101-6200374842000114135
6200374842000114150-6200374842000114184
6200374842000114200-6200374842000114218
6200374842000114234-6200374842000114259
6200374842000114275-6200374842000114358
6200374842000114389

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-11-21 11:55 |显示全部楼层
本帖最后由 moperyblue 于 2016-11-21 15:10 编辑
  1. awk 'function s(a,len){return substr($0,a,len)}s(1,10)==p1&&s(11,8)-p2!=1&&NR>1{print  "-" RS $0;p1=s(1,10);p2=s(11,8);next}{p1=s(1,10);p2=s(11,8);print}' ufile |awk -vRS=- '{print $1 (NF>1?RS $NF:"")}'
复制代码
  1. awk -M -vFIELDWIDTHS="18 1" 'function p(){print (length(a)>1)?a[1]"-"a[length(a)]:a[1]}$1-s!=1&&a[1]{p();delete a;i=0;s=$1;a[++i]=$0;next}{s=$1;a[++i]=$0}END{p()}' ufile #GNU Awk 4.1.4, API: 1.1 (GNU MPFR 2.4.1, GNU MP 4.3.1)
复制代码


论坛徽章:
3
15-16赛季CBA联赛之北控
日期:2016-06-06 21:01:08程序设计版块每日发帖之星
日期:2016-06-19 06:20:00程序设计版块每日发帖之星
日期:2016-07-17 06:20:00
发表于 2016-11-21 17:13 |显示全部楼层
回复 7# jason680
jason大神的代码好使,灰常感谢!!

论坛徽章:
3
15-16赛季CBA联赛之北控
日期:2016-06-06 21:01:08程序设计版块每日发帖之星
日期:2016-06-19 06:20:00程序设计版块每日发帖之星
日期:2016-07-17 06:20:00
发表于 2016-11-21 17:14 |显示全部楼层
回复 6# yinyuemi

ss博就是吊,awk4.x 没装,暂时没有测试!

论坛徽章:
3
15-16赛季CBA联赛之北控
日期:2016-06-06 21:01:08程序设计版块每日发帖之星
日期:2016-06-19 06:20:00程序设计版块每日发帖之星
日期:2016-07-17 06:20:00
发表于 2016-11-21 17:43 |显示全部楼层
回复 7# jason680
我发现一个bug:如果文本是:
6200374842000114063
6200374842000114093
6200374842000114101
6200374842000114127
6200374842000114143
6200374842000114150
6200374842000114168
6200374842000114176
6200374842000114184
6200374842000114192

非连续的行,出来的结果没换行!
希望再优化一下!


[root@]# cat ufile
6200374842000114063
6200374842000114093
6200374842000114101
6200374842000114127
6200374842000114143
6200374842000114150
6200374842000114168
6200374842000114176
6200374842000114184
6200374842000114192
[root@]# awk 'function d1(p,n){return (substr(p,1,9)==substr(n,1,9)&&substr(p,10,9)+1==substr(n,10,9))}function x(){if(s!=p)print c P;printf $1;c="-";s=p=n=$1;next}{n=substr($1,1,1;if(s==""x();if(d1(p,n)){p=n=$1;next}x()}END{print (s!=p)?cP:""}' ufile
62003748420001140636200374842000114093-6200374842000114101
62003748420001141276200374842000114143

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP