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 编辑
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
复制代码
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
awk '/^[-]*[0-9]+/{
if($1 == 0) {
print;
next;
}
line++;
sum += $2;
if(line % 5 == 1) {
begin = $1;
}
else if(line % 5 == 0) {
printf("%d--%d %d\n", begin, $1, sum);
sum = 0;
}
}' testfile;
复制代码
作者:
ly5066113
时间:
2015-03-11 14:05
本帖最后由 ly5066113 于 2015-03-11 14:07 编辑
回复
1#
biobaby
如果第一列是连续的:
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
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 编辑
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 编辑
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}
else {b+=$2} if ($1==0) {print $0;t=0;b=0} }' file
-10---6 247
-5---1 349
0 282
1--5 405
6--10 294
11--15 295
16--20 218
复制代码
回复
1#
biobaby
运行了楼上个为大神的代码,怎么结果都不一样呢?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2