[英]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.