簡體   English   中英

基於多列的計數

[英]Count Based on Multiple Columns

我有一個很大的日志文件,其中包含用戶ID和IP地址。 我正在嘗試確定查看特定IP登錄多少用戶ID的最佳方法。

最初,我以為可以通過命令行上的cut,sort和uniq來做到這一點,但我沒有得到想要的輸出。 Python或bash解決方案將是理想的選擇。

以下是該文件的示例:

eric 1.1.1.1
eric 1.1.1.1
brian 1.1.1.1
jeff 1.1.1.1
eric 2.2.2.2
bob 3.3.3.3
jeff 3.3.3.3
eric 1.1.1.1
eric 1.1.1.1
eric 4.4.4.4
peter 4.4.4.4

我希望輸出顯示此類信息:

eric - 1.1.1.1, 2.2.2.2, 4.4.4.4
brian - 1.1.1.1
jeff - 1.1.1.1, 3.3.3.3
bob - 3.3.3.3
peter - 4.4.4.4

以及:

1.1.1.1 - eric, brian, jeff
2.2.2.2 - eric
3.3.3.3 - bob, jeff
4.4.4.4 - peter

隨着它的成熟,我將不得不為排除IP創建一個變量,在這里我們可以說1.1.1.1是NAT並且是受信任的,因此我們可以忽略它,因為會有多個用戶來自它。

正確地朝正確的方向推動。

考慮以下以輸入過程輸出樣式編寫的腳本。

一些注意事項:

fileinput模塊允許您在命令行上指定單個輸入文件名,多個文件名或根本不指定文件名(在這種情況下,它將使用stdin)。

defaultdict使您可以方便地收集數據集。

', ' join生成所需的逗號分隔的輸出行。

使用生成器表達式(line.split() for line ...)而不是列表[line.split() for line ...]可以節省內存(您說的是大文件)。 如果使用列表推導,則所有數據將兩次存儲在內存中。

隨着代碼的成熟,您可以切換到argparse來控制添加的新功能。

import fileinput
import collections

# Input the data
raw_data = (line.split() for line in fileinput.input())

# Process the data
name2ip = collections.defaultdict(set)
ip2name = collections.defaultdict(set)
for name, ip in raw_data:
    name2ip[name].add(ip)
    ip2name[ip].add(name)

# Output the data
for name, ips in name2ip.items():
    print '%s - %s'%(name, ', '.join(ips))

for ip, names in ip2name.items():
    print '%s - %s'%(ip, ', '.join(names))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM