本次我们的作业都围绕这个数据来展开,请大家在这里下载:
下载地址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可能会在一天记录多次
- 转发数和评论数在不同时间记录,数值会发生变化
# 数据清洗,去掉格式不符合的行chaos-MacBook-Pro:awk_exam chao$ time awk 'NF==6' weibo_freshdata.2020-04-10 > weibo_formatdata.2020-04-10real 1m2.922suser 0m24.304ssys 0m5.682s
练习1,用awk写出相应的脚本过程,回答下面问题
- 找到这有天转发量最大的微博,这条微博是谁发布的?记录id是多少?
获取所有微博中最大的转发量
chaos-MacBook-Pro:awk_exam chao$ LC_ALL=Cchaos-MacBook-Pro:awk_exam chao$ time gsort -k5rn weibo_formatdata.2020-04-10 | awk 'NR==1{print "UserId: " $1 "\nForwardNum: " $5}'UserId: 44198888474ForwardNum: 1000000real 1m28.573suser 0m57.217ssys 0m8.980schaos-MacBook-Pro:awk_exam chao$ time gsort -k5rn weibo_formatdata.2020-04-10 | head -1 | awk '{print "UserId: " $1 "\nForwardNum: " $5}'UserId: 44198888474ForwardNum: 1000000real 0m43.783suser 0m38.578ssys 0m6.460schaos-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}'UserId: 44198888474ForwardNum: 1000000real 0m18.650suser 0m16.661ssys 0m0.943s
- 找到转发量最大的前10条微博,评论量最大的前10条微博,记录id是多少,都是谁发布的?
# 转发chaos-MacBook-Pro:awk_exam chao$ time gsort -k5rn weibo_formatdata.2020-04-10 | awk -f awkfile_2_1Forward: 1000000 Article: 4492118670464947 User: X玖少年团肖战DAYTOYForward: 839350 Article: 4491769939216991 User: 央视新闻Forward: 803749 Article: 4491775148673510 User: 蔡徐坤Forward: 786617 Article: 4492135753830523 User: UNIQ-王一博Forward: 557271 Article: 4492235121277302 User: 华晨宇yuForward: 529550 Article: 4491774955539019 User: 蔡徐坤Forward: 417781 Article: 4491769431856516 User: 人民日报Forward: 383303 Article: 4492122809840115 User: R1SE-周震南Forward: 383274 Article: 4491886414393947 User: 南风窗Forward: 337600 Article: 4491761814571777 User: ELLEreal 0m36.942suser 0m38.538ssys 0m5.923schaos-MacBook-Pro:awk_exam chao$ cat awkfile_2_1BEGIN {count = 0;}{if (count < 10) {if(!a[$4]) {a[$4] = 1;count = count + 1;printf "Forward: %-15s Article: %-20s User: %s\n",$5,$4,$3;}} else {exit 1;}}# 评论chaos-MacBook-Pro:awk_exam chao$ time gsort -k6rn weibo_formatdata.2020-04-10 | awk -f awkfile_2_2Comment: 2421638 Article: 4491813736120269 User: 中国消防Comment: 1000000 Article: 4492118670464947 User: X玖少年团肖战DAYTOYComment: 379997 Article: 4491775148673510 User: 蔡徐坤Comment: 310893 Article: 4491774955539019 User: 蔡徐坤Comment: 216299 Article: 4492135753830523 User: UNIQ-王一博Comment: 169244 Article: 4491813706611014 User: 广西消防Comment: 126104 Article: 4491818554828901 User: 炎亞綸_AaronYanComment: 116820 Article: 4492235121277302 User: 华晨宇yuComment: 81901 Article: 4491886414393947 User: 南风窗Comment: 75554 Article: 4492103340000895 User: 罗云熙Leoreal 0m36.790suser 0m41.033ssys 0m5.953schaos-MacBook-Pro:awk_exam chao$ cat awkfile_2_2BEGIN {count = 0;}{if (count < 10) {if(!a[$4]) {a[$4] = 1;count = count + 1;printf "Comment: %-15s Article: %-20s User: %s\n",$6,$4,$3;}} else {exit 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
4. 转发数和评论数的总和超过1000的微博有多少条(要注意对微博id去重)```bashchaos-MacBook-Pro:awk_exam chao$ time awk '{if($5+$6>1000){print $4;}}' weibo_formatdata.2020-04-10 | sort | uniq | wc -l10932real 0m22.922suser 0m20.875ssys 0m0.940s
- 发布转发数和评论数总和超过1000的微博用户有多少个?
只要一个用户只要有一条微博超过1000即可
chaos-MacBook-Pro:awk_exam chao$ time awk '{if($5+$6>1000){print $2;}}' weibo_formatdata.2020-04-10 | sort | uniq | wc -l6283real 0m21.395suser 0m20.491ssys 0m0.864s
- 所有记录中,微博id如果重复只取最大的转发数和最大的评论数。那么这一天的所有数据中,总的转发量是多大?,总的评论量是多大?
例如:4491900012823164 这条人民日报发布的微博,转发量用13618来进行统计;评论量用1993来进行统计
chaos-MacBook-Pro:awk_exam chao$ time gsort -k4,4 -k5,5rn weibo_formatdata.2020-04-10 | awk -f awkfile_6_1Total forwards: 64582729real 1m23.387suser 1m56.066ssys 0m8.013schaos-MacBook-Pro:awk_exam chao$ cat awkfile_6_1BEGIN {total_forward = 0;last_weibo_id = "";}{if ($4 != last_weibo_id) {last_weibo_id = $4;total_forward += $5;} else {next;}}END {print "Total forwards: ",total_forward}chaos-MacBook-Pro:awk_exam chao$ time gsort -k4,4 -k6,6rn weibo_formatdata.2020-04-10 | awk -f awkfile_6_2Total comments: 50014190real 1m26.358suser 1m58.250ssys 0m7.795schaos-MacBook-Pro:awk_exam chao$ cat awkfile_6_2BEGIN {total_comments = 0;last_weibo_id = "";}{if ($4 != last_weibo_id) {last_weibo_id = $4;total_comments += $6;} else {next;}}END {print "Total comments: ",total_comments}
总的转发量是64582729 总的评论量是50014190
- 找到所有微博用户在这一天修改过昵称,并按照修改次数从大到小排列,并列出,都使用过哪些昵称。例如:
第一列是修改次数,第二列是微博用户id,第三列以后是曾经用过的用户昵称,如下图:
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_7real 1m34.896suser 1m48.765ssys 0m17.648schaos-MacBook-Pro:awk_exam chao$ cat awkfile_7BEGIN {count=0;}{if(count == 0) {name_history=$2;last_user_id=$1;last_name=$2;count = 1;next;}if ($1 == last_user_id) {if ($2 == last_name) {next;} else {name_history = (name_history"\t"$2)count++;last_name = $2;}} else {if (count > 1) {printf "%d\t%s\t%s\n", count, last_user_id, name_history;}name_history=$2;last_user_id=$1;last_name=$2;count = 1;}}chaos-MacBook-Pro:awk_exam chao$ head result_73 1619787575 喵喵王0609 喵喵的小夜曲 喵喵的月光曲3 1803176071 一只小阿冰吖 捉到一只小憨 活捉到一只小憨孙3 2149595787 Archangel-9 Archangel-9王桉棋 Archangel9CHN3 2629769851 不二大猪蹄子 不二猪蹄儿 猪蹄儿哥哥不二3 2960360057 孙咩咩DOYTOY 孙咩咩Y 孙咩咩y3 3029140585 多多多多多多漂亮 漂亮女孩多美丽 野生仙女啊3 5533178626 Biiiii咔嘣脆脆鲨 Jiiiii咔嘣脆脆鲨 大头星人她很酷3 6118404813 鸠瑶 鸠瑶-呆桃 鸠瑶DAYTOY3 6282180382 DirtyOO999 你永远得不到的爸爸耶 头给你拧掉呢3 6299342317 欧气满满的莫莫尼耶 欧气满满的锦鲤莫莫尼耶 欧气的莫莫尼
- 发现用户昵称长度的分布规律,统计不同字数的用户人数。得到如下数据中间\t隔开。用户修改昵称的情况不用考虑,否则会很复杂,多个昵称的用户,任意选择一个昵称来进行统计即可。
格式:字数 \t 用户数,例如
其中5个字的用户最多有98万多人。
chaos-MacBook-Pro:tmp chao$ LC_ALL=en_US.UTF-8chaos-MacBook-Pro:awk_exam chao$ awk '{print $2,"\t"$3}' weibo_formatdata.2020-04-10 | gsort --parallel=4 -k1,1 > tempchaos-MacBook-Pro:awk_exam chao$ LC_ALL=en_US.UTF-8chaos-MacBook-Pro:awk_exam chao$ awk -f awkfile_8 temp > result_8chaos-MacBook-Pro:awk_exam chao$ cat awkfile_8BEGIN {last_user_id = ""}{if ($1 != last_user_id) {a[length($2)]++;last_user_id = $1;}}END {for(i in a) {if(a[i]) {print i, "\t", a[i]}}}chaos-MacBook-Pro:awk_exam chao$ head result_81 52 577733 3302324 8570825 9822526 9348407 9741778 7064219 50946210 377554
- 按照发文数量做一个发文用户排行榜,按照发文数量倒叙排列,第一列是用户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
(这里如果还没整明白可以找助教和我问)
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_9real 1m46.867suser 2m13.230ssys 0m20.334schaos-MacBook-Pro:awk_exam chao$ cat awkfile_9BEGIN {last_user_id = ""; article_cnt = 0;}{if (article_cnt == 0) {article_cnt = 1;last_user_id = $1;next;}if ($1 == last_user_id) {article_cnt++;} else {print last_user_id, "\t", article_cnt;article_cnt = 1;last_user_id = $1;}}END {print last_user_id, "\t", article_cnt;}chaos-MacBook-Pro:awk_exam chao$ head result_96331476961 320726997634787 146316550222341 107777047271339 107687348497948 100006497176672 97356542428700 83586456772530 76636516786482 74676666331937 7440
- 第四题的输出结果中改成第一列是用户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; }
if (last_user_id == $1) {if (last_article_id != $3) {article_cnt++;last_article_id = $3;}} else {print last_user_id, "\t", last_nick_name, "\t", article_cnt;last_user_id = $1;last_nick_name = $2;last_article_id = $3;last_row = $0;article_cnt = 1;}
} 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 ```
