忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
论坛 程序设计 Shell shell
12下一页
最近访问板块 发新帖
查看: 8556 | 回复: 10

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

论坛徽章:
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
发表于 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
发表于 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;
复制代码

论坛徽章:
21
15-16赛季CBA联赛之广东
日期:2016-01-19 13:33:37申猴
日期:2014-10-23 08:36:23白羊座
日期:2014-10-27 11:14:37射手座
日期:2014-11-25 08:56:112015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:572015亚冠之阿尔萨德
日期:2015-07-21 15:17:182015亚冠之莱赫维亚
日期:2015-05-12 17:03:122015年亚洲杯之约旦
日期:2015-04-03 11:15:162015年亚洲杯之科威特
日期:2015-03-16 09:11:522015年迎新春徽章
日期:2015-03-04 09:49:032015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 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
申猴
日期:2014-09-19 11:12:372015亚冠之大阪钢巴
日期: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-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
发表于 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
复制代码

求职 : 机器学习
论坛徽章:
78
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:452022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:57
发表于 2015-03-11 14:15 |显示全部楼层
第一列万一含0行的上下的行数不为5的整数倍,怎么办?

论坛徽章:
0
发表于 2015-03-11 15:00 |显示全部楼层
不好意思 呵呵  。  如果我只算-100 到 100之内呢?回复 6# zsszss0000


   

论坛徽章:
0
发表于 2015-03-11 15:02 |显示全部楼层
有大神用二维数组解决下吗?我想学习一下

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
发表于 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

求职 : 机器学习
论坛徽章:
78
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:452022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:57
发表于 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里面进行打印
您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票7.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP