我有3个文件。 file1有电影数据(电影ID和电影类型,如hoorror,浪漫和喜剧)。 file2具有用户数据(用户ID,性别,职业)。 file3具有评级数据(用户ID,电影ID和评级)。
现在,我需要在bash脚本中使用awk找到女性喜欢的电影类型(评级> 3被认为是最喜欢的)。
答案 0 :(得分:1)
我意识到我可能会因为没有真正回答这个问题而受到惩罚,但你可以通过sqlite轻松完成所要求的。
以下会话说明查询数据以返回女性平均评分为>= 3
的电影:
$ sqlite3
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .separator ,
sqlite> .import movie_data.csv movie
sqlite> .import user_data.csv user
sqlite> .import rating_data.csv rating
sqlite> .schema
CREATE TABLE movie(
"movie_id" TEXT,
"movie_type" TEXT
);
CREATE TABLE user(
"user_id" TEXT,
"gender" TEXT,
"occupation" TEXT
);
CREATE TABLE rating(
"user_id" TEXT,
"movie_id" TEXT,
"rating" TEXT
);
sqlite> select r.movie_id, avg(r.rating) from rating r
...> inner join user u on r.user_id = u.user_id
...> where u.gender = 'F'
...> group by r.movie_id
...> having avg(r.rating) >= 3;
1,10.0
2,4.5
4,6.5
sqlite>
答案 1 :(得分:0)
首先,我们想要一份女性ID列表
females=$(awk '$2=="female"{printf $1 ","}' victims.txt)
接下来,我们想要一个女性喜欢的电影ID列表, 我们将女性列表传递给awk命令,首先我们将所有女性ID放入数组变量中,方法是将女性 CSV 字符串拆分并放入数组中
movies=$(awk -v females="$females" '
BEGIN{split(females,temp,",");
for(i in temp) flist[temp[i]]}
$3>3 {if($1 in flist) printf $2 ","}' ratings.txt)
此时,我们已准备好扫描电影文件,就像之前我们想要解压缩上一步中准备的数据一样(这一次,计算出现次数),然后它就像一样简单因为打印电影类型的次数是有利的,排序和使用uniq
实用程序。
awk -v movies="$movies" '
BEGIN{split(movies,temp,",");
for(i in temp) mlist[temp[i]]++}
{if($1 in mlist) for(i=0;i<mlist[$1];i++)print $2}' movies.txt | sort | uniq -c
由于我没有任何数据,可能的测试数量接近于零。
答案 2 :(得分:0)
使用join
,假设people.csv
和movies.csv
已经在主键上排序,假设该类型为f
或m
sort -n -t, ratings.csv | join -t, people.csv - | sort -n -t, -k4,4 | join -t, -2 4 movies.csv - | awk -F, '$4=="f"&&$6>3'
将很乐意打印包含以下字段的列表
movie_id, movie_genre, id, genre, occupation, movie_rating
您可以使用sort和uniq进一步使用awk和postprocess进行过滤,如前所述。
我需要了解join
的工作原理......
值得一提的是,使用bash
,可以使用进程替换(<(...)
构造)来编写无管道命令行,但是{{ 1}}支持从标准输入读取,管道解决方案更通用。