实战演练awk

众所周知,awk、sed是相对高阶的Linux命令,是处理数据的神兵利器。另外awk不仅仅是一个命令,它本身的语法也是一门编程语言。

学习awk有时候倒不是有多难,只是各种细节,经常忘,每次用起来的时候又要重新在浩瀚的互联网上搜索一番。着实费力,本文用一些实战演练来帮你学习awk,建议收藏。用的时候可以速查一下。

数据集

首先为了方便演练,我们需要一个公开的数据集,可以去这个网站:https://grouplens.org/datasets/movielens/ 寻找电影评分相关的数据。

你也可以直接复制如下链接,来直接数据集的压缩包。https://files.grouplens.org/datasets/movielens/ml-25m.zip

rating.csv

rating.csv数据集中一个csv文件,记录了用户给电影评分相关的数据,它有4列,如下:

userId,movieId,rating,timestamp 1,296,5.0,1147880044 1,306,3.5,1147868817 1,307,5.0,1147868828 1,665,5.0,1147878820 1,899,3.5,1147868510 1,1088,4.0,1147868495 1,1175,3.5,1147868826 1,1217,3.5,1147878326 1,1237,5.0,1147868839

首先可以预处理去掉第一行(列名)

sed -i '1d' ratings.csv

聚合

计算总评分

awk -F ',' '{sum += $3} END {print sum}' ratings.csv 

awk的列序号是从1计数的,因为0表示这一整行。评分(rating)是第三列,所以加$3

计算平均分

awk -F ',' '{sum += $3} END {print sum/NR}' ratings.csv

统计每个用户给多少部电影评过分

awk -F',' '{x[$1]++} END{for (i in x) printf("%s,%s\n", i,x[i])}' ratings.csv
awk -F',' '{x[$1]++} END{for (i in x) print i","x[i]}' ratings.csv

print i","x[i] 可以替换成 printf("%s,%s\n", i, x[i])

计算每个用户评分的平均分

awk -F',' '{x[$1]++; y[$1]+=$3} END{for (i in x) print i","y[i]/x[i]}' ratings.csv

生成每个用户打过分的电影列表

userId后面使用: movId之间用,

awk -F',' '{x[$1][$2]=0} END{for(i in x) {printf("%s:",i); for(j in x[i]) printf("%s,",j); print ""}}' ratings.csv

107845:25,32,36,62,95,112,141,260,494,608,628,637,648,653,733,736,762,786,788,802,

上面这个语法用到了awk的二维数组,有些awk的命令可能不支持(比如Mac上的awk),还可以这样写:

awk -F',' '{x[$1] = x[$1]""$2","} END {for (i in x) print i":"x[i]}' ratings.csv

字符串的拼接不用直接用+,不然会按数字处理。字符串的拼接用a = a""b

如果想去掉末尾的逗号。

awk -F',' '{if (x[$1] != "") x[$1] = x[$1]","$2; else x[$1] = ""$2;} END {for (i in x) print i":"x[i]}' ratings.csv

生成每个用户打过分的电影列表含评分

格式如下:

userid:movId,rating;movid,rating;

awk -F',' '{x[$1] = x[$1]""$2","$3";"} END {for (i in x) print i":"x[i]}' ratings.csv

可以将上面生成的文件保存成new_rating.csv。继续用来演示数据拆分

拆分

把new_rating拆分成单行

格式如下:

userId,movId,rating

awk -F'[:;]' '{for(i = 2; i < NF; i++) print $1","$i}' new_rating.csv

133419,81562,3.0 133419,96488,4.0 133419,5952,3.5 133419,34405,3.5 133419,6187,3.5 133419,4226,4.0 133419,33166,4.5 133419,3977,3.0 133419,6539,4.0 133419,3897,4.0

把new_rating拆分成单行

同时修改分隔符为TAB

userId\tmovId\trating

两次分割实现:

awk -F'[:;]' '{for(i = 2; i < NF; i++) {split($i, x, ","); print $1"\t"x[1]"\t"x[2] }}' new_rating.csv

一次分割实现

awk -F'[:;,]' '{for(i = 2; i < NF; i+=2) print $1"\t"$i"\t"$(i+1)}' new_rating.csv

关联

将电影ID替换成电影名

我们的数据集中还有一个文件是 movies.csv,里面有电影的信息:

movieId,title,genres 1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fan>tasy 2,Jumanji (1995),Adventure|Children|Fantasy 3,Grumpier Old Men (1995),Comedy|Romance 4,Waiting to Exhale (1995),Comedy|Drama|Romance 5,Father of the Bride Part II (1995),Comedy 6,Heat (1995),Action|Crime|Thriller 7,Sabrina (1995),Comedy|Romance 8,Tom and Huck (1995),Adventure|Children 9,Sudden Death (1995),Action

这需要awk一次处理两个文件。

awk -F',' 'BEGIN {FS=","; while(getline<"movies.csv") a[$1]=$2} {$2=a[$2]; OFS=",";print $0}' ratings.csv

原文地址:https://cloud.tencent.com/developer/article/2171232

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340