2013-09-11 90 views
-3

我想打印唯一字符串值的計數,字符長度和相應的字符串。 Python很好,但可以使用其他工具提供建議。如果需要特定輸出,可以很容易解析的製表符分隔或相似。這是Parsing URI parameter and keyword value pairs的後續行動。組和計數唯一字符串值和長度

示例源:

date=2012-11-20 
test= 
y=5 
page=http%3A//domain.com/page.html&unique=123456 
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
test= 
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
y=5 
page=http%3A//support.domain.com/downloads/index.asp 
page=http%3A//support.domain.com/downloads/index.asp 
view=month 
y=5 
y=5 
y=5 

輸出示例:

5 3 y=5 
3 78 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
2 52 page=http%3A//support.domain.com/downloads/index.asp 
2 5 test= 
1 15 date=2012-11-20 
1 10 view=month 

這裏是我能夠使用單襯墊,但假設它可以更容易地拿出一些在示例Python可以處理這個和長度計數。

$ sort test | uniq -c | sort -nr 
     5  y=5 
     3  refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
     2  test= 
     2  page=http%3A//support.domain.com/downloads/index.asp 
     1  view=month 
     1  page=http%3A//domain.com/page.html&unique=123456 
     1  date=2012-11-20 
+0

記住你以前的答案,你是基於這個http://stackoverflow.com/questions/18726136/parsing-uri-parameter-and-keyword-value-pairs也是在Python中...它可能有通過提供與該問題的鏈接來提供背景是有用的。因爲你不希望在一個過程中這樣做...... –

+1

@JonClements這是對這個問題的後續,但我想出了額外的要求。更新與原始問題鏈接的問題。 – Astron

回答

1

是的,你可以輕鬆地用Python做到這一點。通常人們會傾向於使用字典來保持重複的軌道

>>> from collections import defaultdict 
>>> group = defaultdict(list) 
>>> with open("test.txt") as fin: 
    for line in fin: 
     group[len(line.rstrip())].append(line) 
>>> for k, g in group.items(): 
    print k, len(g), g[0].strip() 


3 5 y=5 
5 2 test= 
10 1 view=month 
78 3 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
15 1 date=2012-11-20 
48 1 page=http%3A//domain.com/page.html&unique=123456 
52 2 page=http%3A//support.domain.com/downloads/index.asp 

相反,如果你想模仿你的shell命令,類似的事情可以用itertools.groupby,其行爲類似於uniq

>>> with open("test.txt") as fin: 
    file_it = (e.rstrip() for e in fin) 
    for k, g in groupby(sorted(file_it, key = len), len): 
     first_elem = next(g).strip() 
     print k, sum(1 for _ in g) + 1, first_elem 


3 5 y=5 
5 2 test= 
10 1 view=month 
15 1 date=2012-11-20 
48 1 page=http%3A//domain.com/page.html&unique=123456 
52 2 page=http%3A//support.domain.com/downloads/index.asp 
78 3 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname 
實現
+0

看着你的輸出,從第二行開始的長度輸出似乎不正確?似乎每個訂單項都會計入一個額外的字符。 – Astron

+0

@Aston:換行符增加了一個額外的字符,我已經更新了答案以反映換行符。 – Abhijit