在bash脚本中使用awk进行equi连接

时间:2015-02-11 05:22:03

标签: bash awk

我有3个文件。 file1有电影数据(电影ID和电影类型,如hoorror,浪漫和喜剧)。 file2具有用户数据(用户ID,性别,职业)。 file3具有评级数据(用户ID,电影ID和评级)。

现在,我需要在bash脚本中使用awk找到女性喜欢的电影类型(评级> 3被认为是最喜欢的)。

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.csvmovies.csv已经在主键上排序,假设该类型为fm

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}}支持从标准输入读取,管道解决方案更通用。