2013-11-15 63 views
-2

我有一個包含數千個mac地址的大文件(〜10-100MB),每個mac地址可能會在文件中出現多次。 我想編寫一個Perl腳本(或Python腳本),它返回唯一MAC地址的總數。例如,如果我的文件包含Perl或Python:計算文件中不同Mac地址的總數

"hostmac":"112233445566" 
log here 
"hostmac":"23AA23AA23AA" 
log here 
"hostmac":"23AA23AA23AA" 
log here 
"hostmac":"112233445566" 
log here 
"hostmac":"77AABB8899CC" 
log here 
"hostmac":"112233445566" 
log here 
"hostmac":"112233445566" 
log here 
"hostmac":"EEFF00112233" 
log here 

我想讓我的Perl/Python腳本返回4,因爲我有4個唯一的mac地址。

+1

你有什麼這麼遠嗎? – bugsduggan

+2

有問題嗎? –

+0

每行上都有識別格式嗎? –

回答

4

如果格式正是爲你描述:

$ egrep hostmac filename.txt | sort -u | wc -l 
+0

謝謝羅伯,非常感謝您的幫助,這正是我所需要的。Thaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanks ;-) – user2996850

3
perl -nE '$s{$1} = 1 if /hostmac":"(.+?)"/ END{ say scalar keys %s }' file 

爲Perl 5.8及以上:

perl -ne '$s{$1} = 1 if /hostmac":"(.+?)"/ END{ print scalar keys %s }' file 
+0

Perl在同一時間非常性感和骯髒。 – admdrew

+1

@admdrew性感是的,只有在混淆時纔會變髒:) –

+1

有時候,即使使用好的代碼,perl也會感到困惑:D – admdrew

0

假設每線有上面列出的格式,Python的是:

len(set([line.split(':')[1] for line in open(path)])) 
0

Python解決方案:

with open ('data.txt') as f: 
    print len(set(line for line in f if line.startswith('"hostmac":'))) 

這可能是一個班輪實際上,print可以在同一行with ... :-)可以很容易地看到,它採用grepuniqwc的解決方案是最短的,但。學習Unix工具在幾秒鐘內完成這些工作是很好的。

0

Python的答案使用Python的可讀性

def count_unique(filename): 
    mac_addr = set() 
    with open(filename) as f: 
     for line in f: 
      if 'hostmac' in line: 
       mac_addr.add(line.split('"')[-2]) 
    return len(mac_addr) 

if __name__ == '__main__': 
    import sys 
    print count_unique(sys.argv[1]) 

Python的答案用更簡潔的格式

import sys 
with open(sys.argv[1]) as f: 
    print len(set(line.split('"')[-2] for line in f if 'hostmac' in line))