2012-12-13 141 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

相關問題