2012-12-13 3 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 또는 펄 파이썬를 사용하는 팁

된다? 또한 오름차순으로 정렬하고 싶습니다.

+1

왜 'sort -u'가 부적절한 이유는 무엇입니까? – Kevin

+0

감사. sort -u는 괜찮지 만 python/perl 스크립트를 찾고있었습니다. 내 질문에 명확하게 말 했어야합니다 .. – rtinflux

+0

예상되는 결과는 무엇입니까?/32,/28, ...에 상관없이 중복되는 IP를 제거한다는 의미였습니까? –

답변

1

파이썬에서 당신은 할 수 있습니다 :

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

Thanks Avasal .. – rtinflux

+0

@rtinflux : 당신을 도운 답을 받아 들여주십시오. 앞으로 도움이 될 것입니다. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – avasal

2

당신은 sort -ur를 사용하여이 작업을 수행 할 수 있어야합니다.

편집 : 파이썬에서이 작업을 수행하려면, 다음을 수행 할 수 있습니다 : 당신이 경우

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

+ 'sort -ur ipaddress.txt> ipaddress_uniq.txt'와 같이 명령 줄 솔루션에 대해 1 –

0

그들은 AWK를 사용하여 파일에 표시

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

검증되지 않은 : 전체 파이프 라인을 원하는

2

데이터가 매우 규칙적으로 표시되므로 인수를 사용하여 Python에서 올바른 정렬을 보장하는 것이 매우 쉽습니다. 정렬 할 목록의 각 인스턴스에 대해 "정렬 키"를 만드는 데 사용됩니다. 사람들은 종종 람다를 정렬 키 함수로 사용하지만 여기서 완전성을 위해 def이 유용합니다.

중복 제거는 Python으로 정렬하기 전에 수행하는 것이 좋습니다. 어쨌든 목록을 정렬해야하기 때문에 집합으로 변환하면 고유 한 문자열을 순서없이 임의로 정렬 할 수 있습니다. 목록을 "uniquieify"하는 쉬운 방법 l Python에서 순서가 중요하지 않은 경우

l = list(set(l)) 

테스트 데이터는 심하게, 그런데, 선택이기 때문에 것이다 올바르게 정렬 (단지 사고에 의해) 어휘 종류에. 따라서 주소에 2 자리 및 3 자리 구성 요소가 포함 된 몇 가지 예를 포함하면 더 나아질 수 있으므로 더 이상 사실이 아닙니다. 나는 설명의 방법으로 비 작동 종류를 설명한다.

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'] 

그것은 않습니다 그것이 "/ 장식/정렬 undecorate"알고리즘의 일부로 각 목록 값에 한 번만 적용되기 때문에 정렬 키 기능, 파이썬에 있음을 너무 많이 중요하지. 좀더 일반적으로,이 문제 도메인에 대해 도움이되는 ipaddress 모듈을 찾을 수 있습니다 : http://docs.python.org/dev/howto/ipaddress.html

관련 문제