2

2 つの大きなログファイルがあります。デバイスが a にあるが b にないかどうか、およびその逆 (デバイスが一般的な行を除く) を確認したい場合、ファイルは次の例のようになります。

04/09/2010,13:11:52,認証OK,user1,デフォルトグループ,00-24-2B-A1-08-88,29,10.1.1.1,(デフォルト),,,,,,13,EAP -TLS,,device1,
04/19/2010,15:35:24,Authen OK,user2,デフォルト グループ,00-24-2B-A1-05-EA,29,10.1.1.2,(デフォルト),,, ,,,13,EAP-TLS,,device2,
04/09/2010,13:11:52,Authen OK,user3,デフォルト グループ,00-24-2B-A1-08-88,29,10.1.1.3, (デフォルト),,,,,,13,EAP-TLS,,device3,
04/19/2010,15:35:24,Authen OK,user4,デフォルト グループ,00-24-2B-A1-05-EA, 29,10.1.1.4,(デフォルト),,,,,,13,EAP-TLS,,device4,

繰り返しますが、ログファイル a にはあるが b にはなく、b にはあるが a ではないデバイスごとに、デバイス (フィールド [-2]) と IP (フィールド [7]) が必要です。

これまでに行ったことは次のとおりですが、少しぎこちなく、非常に遅いです (各ファイルには約 400K 行あります)。私は2回相互参照しています。誰でも効率を提案できますか?おそらく私は間違ったロジックを使用していますか??

chst={}
chbs={}
for i,line in enumerate(open('chst.txt').readlines()):
    line=line.split(',')
    chst[line[-2]+','+str(i)]=','.join(line)

for i,line in enumerate(open('chbs.txt').readlines()):
    line=line.split(',')
    chbs[line[-2]+','+str(i)]='.'.join(line)

print "these lines are in CHST but not in CHBS"
for a in chst:
    if a.split(',')[0] not in str(chbs.values()):
        line=chst[a].split(',')
        print line[-2], line[7]

print "\nthese lines are in CHBS but not in CHST"

for a in chbs:
    if a.split(',')[0] not in str(chst.values()):
        line=chbs[a].split(',')
        print line[-2], line[7]
4

2 に答える 2

1

あなたは対称的な違いを探しています:

chst = { ( line.split( "," )[ -2 ], line.split( "," )[ 7 ] ) for line in open( ... ) }
chbs = { ( line.split( "," )[ -2 ], line.split( "," )[ 7 ] ) for line in open( ... ) }

diff = chst ^ chbs

非対称の違いが必要な場合は、次を使用します-

chst - chbs # tuples in chst but not in chbs
chbs - chst # tuples in chbs but not in chst

実際の行が必要な場合は、タプルの( device, IP )代わりにセットの代わりに辞書を使用できます。

chst = { ( line.split( "," )[ -2 ], line.split( "," )[ 7 ] ): line for line in open( ... ) }
chbs = { ( line.split( "," )[ -2 ], line.split( "," )[ 7 ] ): line for line in open( ... ) }

diff = chst.items( ) ^ bar.items( )

これは、setlike プロパティを持つアイテムのビューdict.items( )を返すために機能します。これはPython 2.xで呼び出されることに注意してください。dict.viewitems( )

于 2010-08-11T08:42:31.940 に答える
0

=','.join(line) の代わりに ='.'.join(line) を実行している 9 行目にバグがあります。つまり、コンマの代わりに引用符内にドットがあります。または、後で chbs の行をカンマではなくドットで分割する必要があります。

現時点では、device7 が chbs にあるが chst にはないという 3 行がある場合、スクリプトは 3 回表示しますが、問題の説明は、問題が何回表示されるかを知る必要がないことを意味します。本当にそれが必要ですか、それとも 1 つのレポートで複数回発生しても問題ありませんか? その場合、デバイス名を辞書キーとして使用し、他の辞書にそのキーがあるかどうかを確認するだけで簡単にできます。

また、現時点では行番号を記録していますが、実際には使用していません。デバイスが何回表示されるかを知る必要がある場合は、カウントする代わりにそれを報告してみませんか? その場合、デバイス キーをディクショナリに追加するときに、最初にそれが既に存在するかどうかを確認し、存在する場合はカウンターを増やします (おそらく、デバイス名によってキーが設定された別のディクショナリでも)。

于 2010-08-11T09:14:55.783 に答える