对已一组列表:
【8,9,10,11,12,13,14,15,16,17,18,19,64,65,66,67,68,69,70,84,85,86,87,88,89,103】
我希望得到这样的结果:
【8-19,64-70,84-89,103】。
有什么命令或者类似的脚本吗?
怎么实现合并简化列表?
-
- 帖子: 49
- 注册时间: 2006-12-23 10:51
- 枫叶饭团
- 帖子: 14683
- 注册时间: 2010-06-16 1:05
- 系统: Mac OS X
- 来自: Tencent
- 联系:
Re: 怎么实现合并简化列表?
用py到是不难,awk应该也能行
-
- 帖子: 49
- 注册时间: 2006-12-23 10:51
Re: 怎么实现合并简化列表?
嗯,python写了一个。
拍砖~~
拍砖~~
代码: 全选
#!/bin/env python
import os,sys
# 从文件读入列表
f=open(sys.argv[1])
ll=[int(l.strip()) for l in f.readlines()]
f.close()
# 列表去重、排序
ll=list(set(ll))
ll.sort()
#print ll
# 生成标志列表,数值递增置0,否则置1
flag=[0]
for i in range(len(ll)-1):
if ll[i+1]-ll[i] == 1:
flag.append(0)
else:
flag.append(1)
flag.append(1)
#print flag
#print flag.count(1)
# 生成段索引列表,其元素为相邻数组的上下限的索引
istart=0
fieldIndList=[]
for i in range(flag.count(1)):
iend=flag.index(1)
flag[iend]=0
fieldIndList.append( (istart, iend) )
# print '%03d:%03d %04d-%04d ' % (istart, iend, ll[istart], ll[iend-1]),
# print ll[istart:iend]
istart=iend
# 生成段列表,字符串形式
strfield=[]
for field in fieldIndList:
istart, iend = field
if iend-istart==1:
strfield.append( '%d' % ll[istart] )
else:
strfield.append( '%d-%d'%(ll[istart], ll[iend-1]) )
print ','.join(strfield)
代码: 全选
[lz@local]$cat bb
10
1000
1001
1002
103
105
106
107
108
11
12
13
132
133
134
135
136
137
138
[lz@local]$pysort bb
10-13,103,105-108,132-138,1000-1002
-
- 帖子: 1
- 注册时间: 2012-08-10 18:07
Re: 怎么实现合并简化列表?
代码: 全选
#!/usr/bin/tclsh
#
set a "8,9,10,11,12,13,14,15,16,17,18,19,64,65,66,67,68,69,70,84,85,86,87,88,89,103"
set b [lsort -real [split $a ","]]
set i 0
foreach num $b {
set iCurrent $i
set iNext [incr i]
if { [ info exist bNum ] } {
set eNum $num
if { [lindex $b $iNext] != [expr $num+1] } {
lappend newList "$bNum-$eNum"
unset bNum
}
} else {
set bNum $num
if { $i == [llength $b] } {
lappend newList $num
}
}
}
puts [join $newList ","]