本次我们的作业都围绕这个数据来展开,请大家在这里下载:
    下载地址1:http://106.75.65.117:12345/xly/weibo_freshdata.2020-04-10.7z
    下载地址2:http://117.50.101.146:12345/xly/weibo_freshdata.2020-04-10.7z

    大家用7z解压,然后head -20 这个文件,可以看到这个文件的数据格式:

    这里面每条记录是一行,每个数据中间\t隔开(tab键),以第一条记录举例

    第一个字段是数据id,每条数据都有唯一编号,都是自增1的,没有重复。例如第一条记录是44168870965

    第二个字段是微博用户id,例如第一条记录是5789459810

    第三个字段是微博用户昵称,例如第一条记录是andforgettheworld

    第四个字段是微博文章id,每个用户发出的每一条微博文章都有一个唯一不重复的id,例如第一条记录是4491937342273181

    第五个字段是转发数,例如第一条记录是0

    第六个字段是评论数,例如第一条记录是0

    那么这第一条记录如果用文字描述就是:编号44168870965记录了一个微博用户(andforgettheworld),其用户id是5789459810 ,发布了一条微博文章id是(4491937342273181)的微博,这条微博的转发数是0,评论数是0

    进一步理解这个数据,由于一条数据可能多次抓取,不同抓取时间评论量和转发量不完全相同。那么我们会多次记录同一个微博id多次的转发量,评论量,这样就会在数据中出现weiboid的重复。

    例如 grep 4491900012823164 weibo_freshdata.2020-04-10 就会发现人民日报发布的这条微博(4491900012823164),被记录了多次。转发量越来越高直到13618,评论量也是越来越高,直到1993。

    再进一步理解这个数据,我们这个是一天之内的微博数据,其中可能有用户改了昵称,也就是用户id是不变的,用户昵称可能会变化。
    例如 grep 1619787575 weibo_freshdata.2020-04-10 就会发现微博用户(1619787575)在一天之内改了3次昵称,分别是 喵喵王0609 喵喵的月光曲 和 喵喵的小夜曲。

    综合以上认知,我们得到以下结论

    • 微博用户id是保持不变的,但是昵称可能会多次变化
    • 微博的文章id可能会在一天记录多次
    • 转发数和评论数在不同时间记录,数值会发生变化
    1. # 数据清洗,去掉格式不符合的行
    2. chaos-MacBook-Pro:awk_exam chao$ time awk 'NF==6' weibo_freshdata.2020-04-10 > weibo_formatdata.2020-04-10
    3. real 1m2.922s
    4. user 0m24.304s
    5. sys 0m5.682s

    练习1,用awk写出相应的脚本过程,回答下面问题

    1. 找到这有天转发量最大的微博,这条微博是谁发布的?记录id是多少?

    获取所有微博中最大的转发量

    1. chaos-MacBook-Pro:awk_exam chao$ LC_ALL=C
    2. chaos-MacBook-Pro:awk_exam chao$ time gsort -k5rn weibo_formatdata.2020-04-10 | awk 'NR==1{print "UserId: " $1 "\nForwardNum: " $5}'
    3. UserId: 44198888474
    4. ForwardNum: 1000000
    5. real 1m28.573s
    6. user 0m57.217s
    7. sys 0m8.980s
    8. chaos-MacBook-Pro:awk_exam chao$ time gsort -k5rn weibo_formatdata.2020-04-10 | head -1 | awk '{print "UserId: " $1 "\nForwardNum: " $5}'
    9. UserId: 44198888474
    10. ForwardNum: 1000000
    11. real 0m43.783s
    12. user 0m38.578s
    13. sys 0m6.460s
    14. chaos-MacBook-Pro:awk_exam chao$ time awk 'BEGIN{row="";max=0}{if($5>max){max=$5;row=$0;}}END{print row;}' weibo_formatdata.2020-04-10 | awk '{print "UserId: " $1 "\nForwardNum: " $5}'
    15. UserId: 44198888474
    16. ForwardNum: 1000000
    17. real 0m18.650s
    18. user 0m16.661s
    19. sys 0m0.943s
    1. 找到转发量最大的前10条微博,评论量最大的前10条微博,记录id是多少,都是谁发布的?
    1. # 转发
    2. chaos-MacBook-Pro:awk_exam chao$ time gsort -k5rn weibo_formatdata.2020-04-10 | awk -f awkfile_2_1
    3. Forward: 1000000 Article: 4492118670464947 User: X玖少年团肖战DAYTOY
    4. Forward: 839350 Article: 4491769939216991 User: 央视新闻
    5. Forward: 803749 Article: 4491775148673510 User: 蔡徐坤
    6. Forward: 786617 Article: 4492135753830523 User: UNIQ-王一博
    7. Forward: 557271 Article: 4492235121277302 User: 华晨宇yu
    8. Forward: 529550 Article: 4491774955539019 User: 蔡徐坤
    9. Forward: 417781 Article: 4491769431856516 User: 人民日报
    10. Forward: 383303 Article: 4492122809840115 User: R1SE-周震南
    11. Forward: 383274 Article: 4491886414393947 User: 南风窗
    12. Forward: 337600 Article: 4491761814571777 User: ELLE
    13. real 0m36.942s
    14. user 0m38.538s
    15. sys 0m5.923s
    16. chaos-MacBook-Pro:awk_exam chao$ cat awkfile_2_1
    17. BEGIN {count = 0;}
    18. {
    19. if (count < 10) {
    20. if(!a[$4]) {
    21. a[$4] = 1;
    22. count = count + 1;
    23. printf "Forward: %-15s Article: %-20s User: %s\n",$5,$4,$3;
    24. }
    25. } else {
    26. exit 1;
    27. }
    28. }
    29. # 评论
    30. chaos-MacBook-Pro:awk_exam chao$ time gsort -k6rn weibo_formatdata.2020-04-10 | awk -f awkfile_2_2
    31. Comment: 2421638 Article: 4491813736120269 User: 中国消防
    32. Comment: 1000000 Article: 4492118670464947 User: X玖少年团肖战DAYTOY
    33. Comment: 379997 Article: 4491775148673510 User: 蔡徐坤
    34. Comment: 310893 Article: 4491774955539019 User: 蔡徐坤
    35. Comment: 216299 Article: 4492135753830523 User: UNIQ-王一博
    36. Comment: 169244 Article: 4491813706611014 User: 广西消防
    37. Comment: 126104 Article: 4491818554828901 User: 炎亞綸_AaronYan
    38. Comment: 116820 Article: 4492235121277302 User: 华晨宇yu
    39. Comment: 81901 Article: 4491886414393947 User: 南风窗
    40. Comment: 75554 Article: 4492103340000895 User: 罗云熙Leo
    41. real 0m36.790s
    42. user 0m41.033s
    43. sys 0m5.953s
    44. chaos-MacBook-Pro:awk_exam chao$ cat awkfile_2_2
    45. BEGIN {count = 0;}
    46. {
    47. if (count < 10) {
    48. if(!a[$4]) {
    49. a[$4] = 1;
    50. count = count + 1;
    51. printf "Comment: %-15s Article: %-20s User: %s\n",$6,$4,$3;
    52. }
    53. } else {
    54. exit 1;
    55. }
    56. }
    1. 数据集中记录的所有发过微博文章的用户有多少个? ```bash chaos-MacBook-Pro:awk_exam chao$ time awk ‘{print $2}’ weibo_formatdata.2020-04-10 | sort | uniq | wc -l
      6550411

    real 0m49.514s user 0m55.769s sys 0m5.823s

    1. 4. 转发数和评论数的总和超过1000的微博有多少条(要注意对微博id去重)
    2. ```bash
    3. chaos-MacBook-Pro:awk_exam chao$ time awk '{if($5+$6>1000){print $4;}}' weibo_formatdata.2020-04-10 | sort | uniq | wc -l
    4. 10932
    5. real 0m22.922s
    6. user 0m20.875s
    7. sys 0m0.940s
    1. 发布转发数和评论数总和超过1000的微博用户有多少个?

    只要一个用户只要有一条微博超过1000即可

    1. chaos-MacBook-Pro:awk_exam chao$ time awk '{if($5+$6>1000){print $2;}}' weibo_formatdata.2020-04-10 | sort | uniq | wc -l
    2. 6283
    3. real 0m21.395s
    4. user 0m20.491s
    5. sys 0m0.864s
    1. 所有记录中,微博id如果重复只取最大的转发数和最大的评论数。那么这一天的所有数据中,总的转发量是多大?,总的评论量是多大?

    例如:4491900012823164 这条人民日报发布的微博,转发量用13618来进行统计;评论量用1993来进行统计

    1. chaos-MacBook-Pro:awk_exam chao$ time gsort -k4,4 -k5,5rn weibo_formatdata.2020-04-10 | awk -f awkfile_6_1
    2. Total forwards: 64582729
    3. real 1m23.387s
    4. user 1m56.066s
    5. sys 0m8.013s
    6. chaos-MacBook-Pro:awk_exam chao$ cat awkfile_6_1
    7. BEGIN {total_forward = 0;last_weibo_id = "";}
    8. {
    9. if ($4 != last_weibo_id) {
    10. last_weibo_id = $4;
    11. total_forward += $5;
    12. } else {
    13. next;
    14. }
    15. }
    16. END {print "Total forwards: ",total_forward}
    17. chaos-MacBook-Pro:awk_exam chao$ time gsort -k4,4 -k6,6rn weibo_formatdata.2020-04-10 | awk -f awkfile_6_2
    18. Total comments: 50014190
    19. real 1m26.358s
    20. user 1m58.250s
    21. sys 0m7.795s
    22. chaos-MacBook-Pro:awk_exam chao$ cat awkfile_6_2
    23. BEGIN {total_comments = 0;last_weibo_id = "";}
    24. {
    25. if ($4 != last_weibo_id) {
    26. last_weibo_id = $4;
    27. total_comments += $6;
    28. } else {
    29. next;
    30. }
    31. }
    32. END {print "Total comments: ",total_comments}

    总的转发量是64582729 总的评论量是50014190

    1. 找到所有微博用户在这一天修改过昵称,并按照修改次数从大到小排列,并列出,都使用过哪些昵称。例如:

    第一列是修改次数,第二列是微博用户id,第三列以后是曾经用过的用户昵称,如下图:
    image.png

    1. chaos-MacBook-Pro:awk_exam chao$ time awk '{print $2,$3}' weibo_formatdata.2020-04-10 | sort -k1,1 -k2,2 | awk -f awkfile_7 | sort -k1,1rn -o result_7
    2. real 1m34.896s
    3. user 1m48.765s
    4. sys 0m17.648s
    5. chaos-MacBook-Pro:awk_exam chao$ cat awkfile_7
    6. BEGIN {count=0;}
    7. {
    8. if(count == 0) {
    9. name_history=$2;
    10. last_user_id=$1;
    11. last_name=$2;
    12. count = 1;
    13. next;
    14. }
    15. if ($1 == last_user_id) {
    16. if ($2 == last_name) {
    17. next;
    18. } else {
    19. name_history = (name_history"\t"$2)
    20. count++;
    21. last_name = $2;
    22. }
    23. } else {
    24. if (count > 1) {
    25. printf "%d\t%s\t%s\n", count, last_user_id, name_history;
    26. }
    27. name_history=$2;
    28. last_user_id=$1;
    29. last_name=$2;
    30. count = 1;
    31. }
    32. }
    33. chaos-MacBook-Pro:awk_exam chao$ head result_7
    34. 3 1619787575 喵喵王0609 喵喵的小夜曲 喵喵的月光曲
    35. 3 1803176071 一只小阿冰吖 捉到一只小憨 活捉到一只小憨孙
    36. 3 2149595787 Archangel-9 Archangel-9王桉棋 Archangel9CHN
    37. 3 2629769851 不二大猪蹄子 不二猪蹄儿 猪蹄儿哥哥不二
    38. 3 2960360057 孙咩咩DOYTOY 孙咩咩Y 孙咩咩y
    39. 3 3029140585 多多多多多多漂亮 漂亮女孩多美丽 野生仙女啊
    40. 3 5533178626 Biiiii咔嘣脆脆鲨 Jiiiii咔嘣脆脆鲨 大头星人她很酷
    41. 3 6118404813 鸠瑶 鸠瑶-呆桃 鸠瑶DAYTOY
    42. 3 6282180382 DirtyOO999 你永远得不到的爸爸耶 头给你拧掉呢
    43. 3 6299342317 欧气满满的莫莫尼耶 欧气满满的锦鲤莫莫尼耶 欧气的莫莫尼
    1. 发现用户昵称长度的分布规律,统计不同字数的用户人数。得到如下数据中间\t隔开。用户修改昵称的情况不用考虑,否则会很复杂,多个昵称的用户,任意选择一个昵称来进行统计即可。

    格式:字数 \t 用户数,例如
    image.png
    其中5个字的用户最多有98万多人。

    1. chaos-MacBook-Pro:tmp chao$ LC_ALL=en_US.UTF-8
    2. chaos-MacBook-Pro:awk_exam chao$ awk '{print $2,"\t"$3}' weibo_formatdata.2020-04-10 | gsort --parallel=4 -k1,1 > temp
    3. chaos-MacBook-Pro:awk_exam chao$ LC_ALL=en_US.UTF-8
    4. chaos-MacBook-Pro:awk_exam chao$ awk -f awkfile_8 temp > result_8
    5. chaos-MacBook-Pro:awk_exam chao$ cat awkfile_8
    6. BEGIN {last_user_id = ""}
    7. {
    8. if ($1 != last_user_id) {
    9. a[length($2)]++;
    10. last_user_id = $1;
    11. }
    12. }
    13. END {
    14. for(i in a) {
    15. if(a[i]) {
    16. print i, "\t", a[i]
    17. }
    18. }
    19. }
    20. chaos-MacBook-Pro:awk_exam chao$ head result_8
    21. 1 5
    22. 2 57773
    23. 3 330232
    24. 4 857082
    25. 5 982252
    26. 6 934840
    27. 7 974177
    28. 8 706421
    29. 9 509462
    30. 10 377554
    1. 按照发文数量做一个发文用户排行榜,按照发文数量倒叙排列,第一列是用户id,第二列是发文数量。

    注意要对weiboid去重。例如一个用户只发了一条微博,但是由于我们数据记录了多次,从而出现了weiboid的重复,需要去掉这种重复后,判断用户真正发文的数量。例如:
    数据中用户id是123,456分别发布了weiboid为 1122,2233,3344,5566,7788,这5条,但是数据中由于weiboid的重复记录出现如下情况
    123 1122
    456 2233
    123 3344
    456 2233
    456 5566
    456 7788
    123 3344
    其中红色和绿色部分为记录中的重复,需要去掉其中的一次。实际上,123这个用户只发布了1122,3344这两条微博,而456,只发布了2233,5566,7788。那么统计的结果应该去重后的结果:
    123 2
    456 3
    而不是
    123 3
    456 4
    (这里如果还没整明白可以找助教和我问)

    1. chaos-MacBook-Pro:awk_exam chao$ time awk '{print $2,"\t"$4}' weibo_formatdata.2020-04-10 | sort -k1,1 -k2,2 | uniq | awk -f awkfile_9 | gsort -k2,2rn > result_9
    2. real 1m46.867s
    3. user 2m13.230s
    4. sys 0m20.334s
    5. chaos-MacBook-Pro:awk_exam chao$ cat awkfile_9
    6. BEGIN {last_user_id = ""; article_cnt = 0;}
    7. {
    8. if (article_cnt == 0) {
    9. article_cnt = 1;
    10. last_user_id = $1;
    11. next;
    12. }
    13. if ($1 == last_user_id) {
    14. article_cnt++;
    15. } else {
    16. print last_user_id, "\t", article_cnt;
    17. article_cnt = 1;
    18. last_user_id = $1;
    19. }
    20. }
    21. END {
    22. print last_user_id, "\t", article_cnt;
    23. }
    24. chaos-MacBook-Pro:awk_exam chao$ head result_9
    25. 6331476961 32072
    26. 6997634787 14631
    27. 6550222341 10777
    28. 7047271339 10768
    29. 7348497948 10000
    30. 6497176672 9735
    31. 6542428700 8358
    32. 6456772530 7663
    33. 6516786482 7467
    34. 6666331937 7440
    1. 第四题的输出结果中改成第一列是用户id,第二列是用户昵称,第三列是发文数量。(选作,时间来不及可不做)注意用户id可能有多个昵称,任意选择一个昵称即可。 ```bash chaos-MacBook-Pro:awk_exam chao$ time awk ‘{if($5+$6>1000){print $2,”\t”,$3,”\t”,$4}}’ weibo_formatdata.2020-04-10 | gsort -k1,1 -k3,3 | awk -f awkfile_10 | sort -k3,3rn > result_10

    real 0m22.140s user 0m21.131s sys 0m0.925s

    chaos-MacBook-Pro:awk_exam chao$ cat awkfile_10 BEGIN {article_cnt=0;last_user_id=””;last_article_id=””;last_nick_name=””;} { if (article_cnt == 0) { last_user_id = $1; last_nick_name = $2; last_article_id = $3; last_row = $0; article_cnt = 1; next; }

    1. if (last_user_id == $1) {
    2. if (last_article_id != $3) {
    3. article_cnt++;
    4. last_article_id = $3;
    5. }
    6. } else {
    7. print last_user_id, "\t", last_nick_name, "\t", article_cnt;
    8. last_user_id = $1;
    9. last_nick_name = $2;
    10. last_article_id = $3;
    11. last_row = $0;
    12. article_cnt = 1;
    13. }

    } END {print last_user_id, “\t”, last_nick_name, “\t”, article_cnt;}

    chaos-MacBook-Pro:awk_exam chao$ head result_10 2803301701 人民日报 84 2482557597 韩国me2day 62 2656274875 央视新闻 55 5583227444 千家无名氏 52 1742566624 思想聚焦 51 1216826604 wu2198 42 1618051664 头条新闻 39 5103645868 星闻揭秘 38 1886903325 芒果娱乐 36 5837848666 华晨宇onepiece战斗组 36 ```