2012-12-13 107 views
-3

我有一个包含这些IP地址的txt文件,并希望对它们进行排序以删除重复的IP地址,但保留/子网。使用子网掩码排列IP地址列表

4.4.4.4/32 
4.2.2.2/32 
4.4.4.4/32 
4.2.2.2/32 
4.2.2.2/28 
4.4.4.4/24 
2.2.2.2/32 

例如:分选和去除重复后,将上述变

4.4.4.4/32 
4.2.2.2/32 
4.2.2.2/28 
4.4.4.4/24 
2.2.2.2/32 

使用AWK或Perl或Python任何提示吗?我也想按升序排序。

+1

为什么简单的'sort -u'不够? – Kevin

+0

谢谢。排序-u很好,但我正在寻找一个Python/Perl脚本。应该清楚地表明我的问题。 – rtinflux

+0

您的预期产出是多少?你的意思是消除重复的IP,无论/ 32,/ 28,...? –

回答

1

在Python中,你可以这样做:

In [3]: l = [] 

In [4]: with open('ipaddress.txt', 'r') as input_file: 
    ...:  for elem in input_file.readlines(): 
    ...:   if elem.strip() not in l: 
    ...:    l.append(elem.strip()) 
    ...: 

In [5]: l 
Out[5]: ['4.4.4.4/32', '4.2.2.2/32', '4.2.2.2/28', '4.4.4.4/24', '2.2.2.2/32'] 
+0

谢谢Avasal .. – rtinflux

+0

@rtinflux:请接受帮助你的答案,将在未来帮助你http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – avasal

2

你应该能够做到这一点只用sort -ur

编辑:Python中做到这一点,你可以做到以下几点:

awk '!seen[$0]++' 

如果您:

with open('ipaddress.txt', 'r') as f: 
    address = sorted(list(set(line for line in f)), reverse=True) 
    for ad in address: 
     print(ad) 
+1

+ 1用于命令行解决方案,如'sort -ur ipaddress.txt> ipaddress_uniq.txt' –

0

你可以在订单独特线,他们用awk在文件中出现希望整个管道:

awk '/#/{sub(/#.*/,"",$0)} length($0) && !seen[$0]++' ipnum.txt 

未经测试

2

由于数据看起来非常规律,因此使用参数确保在Python中正确排序相当容易。这用于为要排序的列表中的每个实例创建一个“排序键”。人们经常使用lambda作为排序键功能,但为了完整起见,我们将在这里使用一些有用的东西。

在Python中进行排序之前,重复删除操作更好。由于无论如何都必须对列表进行排序,因此将其转换为集合将导致唯一字符串的任意排序并不重要,如果排序在Python中无关紧要,那么“简单化”列表的简单方法如下所示: l

l = list(set(l)) 

你的测试数据选择不当,顺便说一句,因为它会正确地排序(只是偶然)对词汇的排序。所以,如果在地址中包含一些包含两位和三位数组件的示例,情况会变得更好,所以这不再适用。我通过解释的方式展示了非工作排序。

In [42]: data = """\ 
4.4.4.4/32 
4.2.2.2/32 
4.4.4.4/32 
4.2.2.2/32 
4.2.2.2/28 
4.4.4.4/24 
2.2.2.2/32 
12.13.14.15/24 
11.12.13.14/24""".splitlines() 

In [43]: data.sort() 

In [44]: data 
Out[44]: 
['11.12.13.14/24', 
'12.13.14.15/24', 
'2.2.2.2/32', 
'4.2.2.2/28', 
'4.2.2.2/32', 
'4.2.2.2/32', 
'4.4.4.4/24', 
'4.4.4.4/32', 
'4.4.4.4/32'] 

In [45]: data = list(set(data)) 

In [46]: data.sort() 

In [47]: data 
Out[47]: 
['11.12.13.14/24', 
'12.13.14.15/24', 
'2.2.2.2/32', 
'4.2.2.2/28', 
'4.2.2.2/32', 
'4.4.4.4/24', 
'4.4.4.4/32'] 

In [48]: def sortkey(addr): 
    ....:  add, pref = addr.split("/") 
    ....:  a, b, c, d = (int(x) for x in add.split(".")) 
    ....:  return a, b, c, d, int(pref) 
    ....: 

In [49]: data.sort(key=sortkey) 

In [50]: data 
Out[50]: 
['2.2.2.2/32', 
'4.2.2.2/28', 
'4.2.2.2/32', 
'4.4.4.4/24', 
'4.4.4.4/32', 
'11.12.13.14/24', 
'12.13.14.15/24'] 

它并没有太大的关系,该排序键的功能是在Python,因为它仅适用于一次每个列表值作为“装饰/排序/去除装饰”算法的一部分。更一般地说,对于这个问题域,您可能会发现ipaddress模块​​有帮助:http://docs.python.org/dev/howto/ipaddress.html

相关问题