-3

これらの IP アドレスを含む txt ファイルがあり、それらを並べ替えて重複する IP アドレスを削除したいのですが、/subnets は保持します。

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 を使用するヒントはありますか? また、昇順で並べ替えたいと思います。

4

4 に答える 4

3

を使用するだけでこれを実行できるはずですsort -ur

編集: Python でこれを行うには、次のようにします。

with open('ipaddress.txt', 'r') as f:
    address = sorted(list(set(line for line in f)), reverse=True)
    for ad in address:
        print(ad)
于 2012-12-13T05:34:02.903 に答える
2

データは非常に規則的であるように見えるため、キー引数を使用して Python で正しい並べ替えを行うのはかなり簡単です。これは、ソートされるリスト内の各インスタンスの「ソート キー」を作成するために使用されます。ソートキー関数としてラムダをよく使用しますが、ここでは完全を期すために、便利なものを定義します。

重複の削除は、Python での並べ替えの前に行ったほうがよいでしょう。リストはとにかくソートする必要があるため、それをセットに変換すると一意の文字列が任意の順序になることは問題ではありません。Python で順序が問題にならない場合、リストlを「一意化」する簡単な方法は次のとおりです。

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

並べ替えキー関数が Python にあることはあまり重要ではありません。これは、「装飾/並べ替え/非装飾」アルゴリズムの一部として各リスト値に一度だけ適用されるためです。より一般的には、この問題のドメインでは、ipaddress モジュールが役立つ場合があります: http://docs.python.org/dev/howto/ipaddress.html

于 2012-12-13T06:05:01.563 に答える
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']
于 2012-12-13T05:32:22.993 に答える
0

awk を使用して、ファイルに表示される順序で一意の行を取得できます。

awk '!seen[$0]++'

パイプライン全体が必要な場合:

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

テストされていない

于 2012-12-13T05:35:00.703 に答える