免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Shell shell
12下一页
最近访问板块 发新帖
查看: 26054 | 回复: 10
打印 上一主题 下一主题

[文本处理] shell [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-11 13:40 |只看该作者 |倒序浏览
大家好,我有这样一个两列的文件,内容是在某个距离上的个数,文件已经按距离排好序,但不只是这些行:如下所示:
distance    number
-10        39
-9        40
-8        53
-7        63
-6        52
-5        70
-4        50
-3        58
-2        81
-1        90
0        282
1        116
2        87
3        57
4        64
5        81
6        61
7        55
8        59
9        54
10        65
11        53
12        59
13        73
14        63
15        47
16        45
17        41
18        38
19        55
20        39
现在想生成一个除了0位置之外,将其他位置每五个合并的结果。就是生成如下样子:
...
-10——-6     五个位置的数量总数
-5——-1     五个位置的数量总数
0      还是282
1——5      五个位置数量总数
6——10     五个位置数量总数
...
以此类推,

请问这样如何能实现呢,不知道有没有把问题描述清楚。呵呵 谢谢大家了。

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
2 [报告]
发表于 2015-03-11 14:00 |只看该作者
本帖最后由 我是一隻羊 于 2015-03-11 15:42 编辑
  1. awk 'NR>1{i=$1==0?0:++i;s=$1==0?$1:i%5==0?s" - "$1:i%5==1?$1:s;k+=$2;if(i%5==0){printf("%8s\t%s\n",s,k);s="";k=0}}' inputfile
复制代码
  1. awk 'function a(x,y){n+=y;s[++i]=x;if((i%5==0)||x==0){z=x==0?0"\t"n:s[1]"-"s[i]"\t"n;print z;i=0;n=0}}NR>1{a($1,$2)}' inputfile
复制代码

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
3 [报告]
发表于 2015-03-11 14:02 |只看该作者
  1.         awk '/^[-]*[0-9]+/{
  2.                 if($1 == 0) {
  3.                         print;
  4.                         next;
  5.                 }
  6.                 line++;
  7.                 sum += $2;
  8.                 if(line % 5 == 1) {
  9.                         begin = $1;
  10.                 }
  11.                 else if(line % 5 == 0) {
  12.                         printf("%d--%d   %d\n", begin, $1, sum);
  13.                         sum = 0;
  14.                 }
  15.         }' testfile;
复制代码

论坛徽章:
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
4 [报告]
发表于 2015-03-11 14:05 |只看该作者
本帖最后由 ly5066113 于 2015-03-11 14:07 编辑

回复 1# biobaby


如果第一列是连续的:
  1. awk 'NR>1&&$1{s+=$2;if(++i==5){print $1-4" -- "$1"\t"s;s=i=0}next}1' file
复制代码

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
5 [报告]
发表于 2015-03-11 14:11 |只看该作者
  1. awk 'NR>1{if($1==0){print $0}else{a+=$2;++b;c[b]=$1;if(!(b%5)){print c[b]-4"--"c[b]"\t"a;a=0}}}' urfile
复制代码

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
6 [报告]
发表于 2015-03-11 14:15 |只看该作者
第一列万一含0行的上下的行数不为5的整数倍,怎么办?

论坛徽章:
0
7 [报告]
发表于 2015-03-11 15:00 |只看该作者
不好意思 呵呵  。  如果我只算-100 到 100之内呢?回复 6# zsszss0000


   

论坛徽章:
0
8 [报告]
发表于 2015-03-11 15:02 |只看该作者
有大神用二维数组解决下吗?我想学习一下

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
9 [报告]
发表于 2015-03-11 18:07 |只看该作者
写的不好,复杂了。awk '{a[i++]=$1;b[j++]=$2}END{for(i=0;i<NR;i=i+5)if(a[i]==0){print a[i]"--"b[i];i=i+1-5}else{print a[i]"--"a[i+4]}}' inputfile

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
10 [报告]
发表于 2015-03-11 20:19 |只看该作者
本帖最后由 zsszss0000 于 2015-03-11 20:20 编辑
  1. awk 'BEGIN{i=1}NR!=1{a[i,1]=$1;a[i,2]=$2;i++}END{for(j=1;j<i;j++){if(a[j,1]==0)break;}for(k=1;k<j;k+=5){sum=a[k,2]+a[k+1,2]+a[k+2,2]+a[k+3,2]+a[k+4,2];print a[k,1]"-"a[k,1],sum}print a[j,1],a[j,2];for(k=j+1;k<i;k+=5){sum=a[k,2]+a[k+1,2]+a[k+2,2]+a[k+3,2]+a[k+4,2];print a[k,1]"-"a[k,1]+4,sum;}}' inputfile  | column -t
复制代码
写了一个特别麻烦的


思路就是
BODY里面填充二维数组
END里面进行打印
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP