0

逆にすると似ている場合に行を削除するpythonコードを取得しました。たとえば、次の内容を含むドキュメントがあるとします。

1,2 3,4
5,6 7,8
2,1 4,3
5,6 8,7

スクリプトを実行した後の出力は次のとおりです。

5,6 7,8
2,1 4,3
5,6 8,7

行の最初の列が 1,2 で、2 番目の列が 7,8 であるとします。別の行で、各列の値が 2,1 AND 8,7 と逆になっている場合、これは逆と見なされます。

ただし、スクリプトが行の順序を保持していないことに気付きました。行の順序は私にとって重要です。また、最初の行ではなく、2 番目の同様の逆行を削除する必要があります。コードは

import sys

with open(sys.argv[1]) as inf:

    keys = set()

    for line in inf:

        ports, ips = line.split()

        port1, port2 = ports.split(",")

        ip1, ip2 = ips.split(",")

        if ip1 < ip2:

            keys.add((ip1, port1, ip2, port2))

        else:

            keys.add((ip2, port2, ip1, port1))

with open('results', 'w') as outf:

    for result in keys:

        outf.write("{1},{3}\t{0},{2}\n".format(*result))

何か案は?bash スクリプトでそれを実行できるかどうか、何か提案はありますか?

ありがとう

4

2 に答える 2

2

ここで使用できcollections.OrderedDictます:

>>> from collections import OrderedDict
>>> dic = OrderedDict()
with open('file.txt') as f:
    for line in f:
        key = tuple(tuple(x.split(',')) for x in line.split())
        rev_key = tuple(x[::-1] for x in key)
        if key not in dic and rev_key not in dic:
            dic[key] = line.strip()
...             
>>> for v in dic.itervalues():
    print v
...     
1,2 3,4
5,6 7,8
5,6 8,7
于 2013-07-12T02:30:20.467 に答える
1

あなたが言及したのでbash、ここにawk解決策があります

awk -F'[ ,]' 'BEGIN{OFS=","} {$1=$1};
!($0 in arr){print($1,$2" "$3,$4);arr[$2","$1","$4","$3]}' file.txt

1,2 3,4
5,6 7,8
5,6 8,7
于 2013-07-12T03:44:49.057 に答える