Chinaunix
标题:
处理这个问题 我的思路写出来了 大家谁还有别的思路
[打印本页]
作者:
dahaoshanhe
时间:
2012-03-03 14:11
标题:
处理这个问题 我的思路写出来了 大家谁还有别的思路
我自己写了一个,哪位高手有更好的解决办法
源文件:
63 63
74 74
82 82
95 95
96 96
99 99
97 97
98 98
100 100
114 114
123 123
135 135
复制代码
目的:在源文件中,每行有两列,两列数值相同,行与行之间有的增量为1,有的增量不为1,如第4行与第
5行增量为1,增量为1的行也可能不是紧邻连续着的,如第5行与第7行增量为1,但是不相邻连续的。想把一个几百万行的
文件中增量为1的行进行压缩,比如95到100之间增量都为1,压缩成95 100 第一列放连续递增中起始值,第二列放连续增
量结束值。
63 63
74 74
82 82
95 100
114 114
123 123
135 135
复制代码
{:3_205:}
我的 :
awk 'BEGIN {
SROW=2
EROW=1540
STARTR=0
ENDR=0
DELTA=0
}
{
if(NR==SROW){
STARTR=$3
ENDR=$4
}
if(NR>SROW){
DELTA=$3-ENDR
if((DELTA==1)||(DELTA==0)) ENDR=$3
if(DELTA>1){
temp=$3
$3=STARTR
$4=ENDR
printf "%s\n",$0
STARTR=temp
ENDR=STARTR
}
}
if(NR==EROW){
$3=STARTR
printf "%s\n",$0
}
}'
复制代码
作者:
rdcwayx
时间:
2012-03-04 07:33
本帖最后由 rdcwayx 于 2012-03-04 08:12 编辑
awk 'BEGIN{min=999999999;t=0}
{a[$1];min=min<$1?min:$1;max=max>$1?max:$1}
END { printf min FS;s=min;
for (i=min+1;i<=max;i++)
{ if (i in a)
{ if (t) {printf i FS;t=0 }
s=i
}
else {if (!t) {printf s RS;t=1}}
}
printf s RS
}' infile
复制代码
作者:
winway1988
时间:
2012-03-04 08:38
昨天回复的帖子怎么都没啦
作者:
jiejie455
时间:
2012-03-04 09:13
本帖最后由 jiejie455 于 2012-03-04 09:13 编辑
#!/usr/bin/awk -f
{
a[$1]=$1;
b[$1]=$0
}
END{
for(i=1;i<=asort(a);i++){
pre=a[i]-1;
post=a[i]+1;
if(b[pre] || b[post]){
if(line!=""){
line=line" "a[i] ;
}else{
line=a[i];
}
}else{
if(line!=""){
gsub(/[ ]+.*[ ]+/," ",line);
print line;
}
line="";
print b[a[i]];
}
}
}
~
复制代码
$ ./data.awk data
63 63
74 74
82 82
95 100
114 114
123 123
135 135
作者:
jiejie455
时间:
2012-03-04 09:26
怎么贴出来,看不见了。论坛是不是有问题啊。再贴一遍。
#!/usr/bin/awk -f
{
a[$1]=$1;
b[$1]=$0
}
END{
for(i=1;i<=asort(a);i++){
pre=a[i]-1;
post=a[i]+1;
if(b[pre] || b[post]){
if(line!=""){
line=line" "a[i] ;
}else{
line=a[i];
}
}else{
if(line!=""){
gsub(/[ ]+.*[ ]+/," ",line);
print line;
}
line=""
print b[a[i]];
}
}
}
~
作者:
rdcwayx
时间:
2012-03-05 18:17
不知为何这个被收到回收站了, 我恢复了。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2