Chinaunix

标题: shell [打印本页]

作者: biobaby    时间: 2015-03-11 13:40
标题: shell
大家好,我有这样一个两列的文件,内容是在某个距离上的个数,文件已经按距离排好序,但不只是这些行:如下所示:
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     五个位置数量总数
...
以此类推,

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

作者: 我是一隻羊    时间: 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
复制代码

作者: liion631818    时间: 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;
复制代码

作者: ly5066113    时间: 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
复制代码

作者: Buring__    时间: 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
复制代码

作者: zsszss0000    时间: 2015-03-11 14:15
第一列万一含0行的上下的行数不为5的整数倍,怎么办?
作者: biobaby    时间: 2015-03-11 15:00
不好意思 呵呵  。  如果我只算-100 到 100之内呢?回复 6# zsszss0000


   
作者: 54nwq    时间: 2015-03-11 15:02
有大神用二维数组解决下吗?我想学习一下
作者: sky_eminem    时间: 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
作者: zsszss0000    时间: 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里面进行打印
作者: zxy877298415    时间: 2015-03-11 20:37
本帖最后由 zxy877298415 于 2015-03-11 21:02 编辑
  1. awk '{t++;if(t==1) {a=$1;b+=$2} else if(t%5==0) {b+=$2;print a"--"$1"\t"b;b=0;} else if(t>1&&t%5==1) {a=$1;b+=$2}
  2. else {b+=$2} if ($1==0) {print $0;t=0;b=0} }' file
  3. -10---6 247
  4. -5---1  349
  5. 0        282
  6. 1--5    405
  7. 6--10   294
  8. 11--15  295
  9. 16--20  218
复制代码
回复 1# biobaby
运行了楼上个为大神的代码,怎么结果都不一样呢?


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2