我在很长一段时间内收集了大量使用wget
收集的网页,我需要分析收藏品,以便我:
1) extract all URLs,
2) format them in a unified fashion,
3) count occurrences of URLs (both base domain and with full path; two separate outputs), and
4) sort output from highest occurring to lowest
例如,在#2上,我的网址可能类似http%3A%2F%2Fblah.com%2Fworld%2Fnews
,blah.com/world/news
,www.blah.com/world/news
,http://www.blah.com/world/news/
或任何此类变体。这些都需要被脚本视为相同的基本域和完整路径。
最终它应该输出两个不同的列表,如:
Based Domains Only:
424 http://youtube.com
325 http://facebook.com
200 http://digg.com
124 http://twitter.com
90 http://news.google.com
Unique URL:
254 http://facebook.com/mypage
123 http://news.google.com/Some-Big-Story
50 http://twitter.com/mrpopular
3 http://youtube.com/some-crazy-video
我在grep上尝试了几种变体,并且已经撞到了一些墙壁。此外,我在获取各种URL转换和标准化方面遇到了一些问题,以便比较正常工作并最终正确计数。
你会采取什么方法来解决这个问题?
* 注意:我想通过shell执行此操作。我可以用Ruby
来写这个,但是这部分是一个练习,看看如何用各种有用的命令/工具更好地融合shell中的各种“肌肉”。 < / p>
答案 0 :(得分:4)
使用awk
cat file
http://www.blah.com/world/news/
http://www.blah.com/world/news/test
http://www.google.com/test/sub
http://www.google.com/tet1
http://www.google.com/no
http://www.blah.com/world/news/
http://www.blah.com/world/news/
URL
awk '{ a[$0]++ } END {for (i in a) print a[i], i }' file | sort -nr
3 http://www.blah.com/world/news/
1 http://www.google.com/tet1
1 http://www.google.com/test/sub
1 http://www.google.com/no
1 http://www.blah.com/world/news/test
域
awk -F\/ '{ a[$1"//"$3]++ } END {for (i in a) print a[i], i }' file | sort -nr
4 http://www.blah.com
3 http://www.google.com
答案 1 :(得分:0)
编写一个解析这些文件的PHP脚本(我喜欢DomCrawler symfony组件,但您可以使用内置的DOMDocument)并将URL粘贴到数据库中,然后您可以查询结果
如果您不想使用MySQL,可以使用sqlite进行嵌入式方法
答案 2 :(得分:0)
使用 Jotne 输入的coreutils方式:
$ sort file | uniq -c
3 http://www.blah.com/world/news/
1 http://www.blah.com/world/news/test
1 http://www.google.com/no
1 http://www.google.com/test/sub
1 http://www.google.com/tet1
$ cut -d/ -f1-3 file | sort | uniq -c
4 http://www.blah.com
3 http://www.google.com