-3

一意の文字列値の数、文字の長さ、およびそれぞれの文字列を出力したいと思います。Python は問題ありませんが、他のツールを使用する提案を受け付けています。特定の出力が必要な場合は、すぐに解析できるタブ区切りまたは同様のものを使用できます。これは、 URI パラメータとキーワード値のペアの解析のフォローアップです。

ソースの例:

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
4

1 に答える 1

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

代わりに、シェルコマンドを模倣したい場合は、同様の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
于 2013-09-11T03:26:04.373 に答える