分页: 1 / 1

怎么实现合并简化列表?

发表于 : 2012-08-08 22:13
linz_p
对已一组列表:
【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】。

有什么命令或者类似的脚本吗?

Re: 怎么实现合并简化列表?

发表于 : 2012-08-08 22:46
枫叶饭团
用py到是不难,awk应该也能行

Re: 怎么实现合并简化列表?

发表于 : 2012-08-08 23:09
linz_p
嗯,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

Re: 怎么实现合并简化列表?

发表于 : 2012-08-10 18:11
simpley

代码: 全选


#!/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 ","]