缘由:
最近 接到一个 任务 从技术上 来说 就是 将 两个表 通过 一个 字段 链接起来。
一个sql 语句 就可以搞定。 select * from a,b where a.id = b.id;
但是 两个表 一个在 mysql 里,一个在 mongoDB 里,无奈 只好 导出 相关 信息 通过 shell 语句 实现 一个 批处理。
Join 命令
而 linux 的 join 命令 正是 恰到好处。它通过 两个文件的 相同字段 进行 链接,从而 实现 类似 mysql 的 select 语句。
使用 join 命令 之前,需将 两个文件 进行排序。这样做是为了效率。假设M,N 为 文件的行数,不排序 时间复杂度O(M*N),排序 时间 复杂度为 O(M+N) 和 排序的时间复杂度 为
O(N*logN) 。 所以 肯定是 先排序,更加 有效率。
举例:
举例:创建文件发file1和file2内容如下:
file1:
file1:
|
|
1.将两个文件 内容相同的行连接起来
|
|
shell 语句:
#!/bin/sh
cd ~/payData
mongoexport -d heli_us -c guests -o mongo.txt
cat mongo.txt | awk -F ',' '{print $4":"$6}' | awk -F ':' '{print $4" "$2}' > account.txt
connect-db < pay > pay.txt
sort pay.txt -o pay.txt
sort account.txt -o account.txt
join pay.txt account.txt > userPay.txt
##cat userPay.txt | awk 'BEGIN {print "return {" } {printf ("\t[%s]\t = %d,\n",$4,$3) } END {print "}"}' > payInfo.lua ## to lua file
cat userPay.txt | awk 'BEGIN {print "begin;" } {printf ("insert into activityPay values (%s,%d);\n",$4,$3) } END {print "commit;"}' > insertPay.sql
connect-db < insertPay.sql > ERROR.log
rm mongo.txt
mv pay.txt pay_Temp.txt
mv account.txt account_Temp.txt
echo "complete"