Linux下Join命令
最近新上线算法,打算分析起点书籍点击率的波动,原来已经有流程每天每本书籍的点击率数据(文件)。之前这种情况都是写代码对不同天的进行合并,后来发现linux下直接就有join命令,可以做类似的事情,而且功能也挺强大,速度也很快。
join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或 2>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]
常用参数说明:
-a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
-e<字符串> 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
-i或–igore-case 比较栏位内容时,忽略大小写的差异。
-o<格式> 按照指定的格式来显示结果。
-t<字符> 使用栏位的分隔字符。
-v<1或2> 跟-a相同,但是只显示文件中没有相同栏位的行。
-1<栏位> 连接[文件1]指定的栏位。
-2<栏位> 连接[文件2]指定的栏位。
–help 显示帮助。
–version 显示版本信息。
注意一下:
1、 文件必须根据join的key进行排序。(join应该是通过多路归并,所以效率比较高)
2、 各种join方式对应如下
内连接(inner join) 格式:join <文件1> <文件2>
左连接(left join, 左外连接, left outer join) 格式:join -a1 <文件1> <文件2>
右连接(right join, 右外连接,right outer join) 格式:join -a2 <文件1> <文件2>
全连接(full join, 全外连接, full outer join) 格式:join -a1 -a2 <文件1> <文件2>
我已有的每天的点击率文件格式是
Bookid PV CLICK CTR
以合并12月20号,和12月19号点击率为例,并且根据20号比19号点击率下降最多的排序,命令如下
join -t” “ -1 1 -2 1 -a 1 -a 2 -o 1.1 -o 2.1 -o 1.4 -o 2.4 -e “0″ ./ctr_1220 ./ctr1219 | awk -F” ” ‘{print $0″ “$4-$3}’ | sort -rn -k 5