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

在bash脚本中使用awk进行equi连接,bash,awk,Bash,Awk,我有3个文件。文件1包含电影数据(电影id和电影类型,如胡罗、浪漫和喜剧)。文件2包含用户数据(用户id、性别、职业)。文件3具有分级数据(用户id、电影id和分级) 现在,我需要在bash脚本中使用awk查找女性喜欢的电影类型(评级>3被认为是最受欢迎的电影类型)。首先,我们需要一个女性ID列表 females=$(awk '$2=="female"{printf $1 ","}' victims.txt) 接下来,我们想要一个女性喜欢的电影ID列表, 我们将女性列表传递给awk命令,首先通

我有3个文件。文件1包含电影数据(电影id和电影类型,如胡罗、浪漫和喜剧)。文件2包含用户数据(用户id、性别、职业)。文件3具有分级数据(用户id、电影id和分级)


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

首先,我们需要一个女性ID列表

females=$(awk '$2=="female"{printf $1 ","}' victims.txt)
接下来,我们想要一个女性喜欢的电影ID列表, 我们将女性列表传递给awk命令,首先通过拆分女性CSV字符串并将其放入数组,将所有女性id放入数组变量中

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
awk-v movies=“$movies”
开始{分割(电影,临时,“,”);
对于(温度中的i)mlist[temp[i]]++}

{如果(i=0;i我意识到我可能会因为没有真正回答问题而受到惩罚,但你所问的问题可以很容易地解决

以下会话说明了查询数据以返回女性平均评级为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> 

使用
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
正如我们前面所看到的,您可以使用awk进一步过滤,并使用sort和uniq进行后处理

我需要了解
join
是如何工作的


值得一提的是,使用
bash
,可以使用进程替换(您需要提供每个文件的样本,然后向我们展示您迄今为止尝试过的代码。此外,您还需要寻找重复的代码。如何在Awk中加入内容是一个非常常见的问题,我的假设是,
people.csv
movies.csv
已经在主键上进行了排序,这是错误的唯一的解决方案不起作用,必须使用临时文件,或者,如果他/她有
bash
,则使用进程替换机制。我对你的答案投了赞成票,因为这正是我的想法:如果你可以使用,不要在
awk
中重写数据库系统。。。