在bash脚本中使用awk进行equi连接
我有3个文件。文件1包含电影数据(电影id和电影类型,如胡罗、浪漫和喜剧)。文件2包含用户数据(用户id、性别、职业)。文件3具有分级数据(用户id、电影id和分级)在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命令,首先通
现在,我需要在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
中重写数据库系统。。。