数据库做两个表的连接操作很方便。如果不用数据库,用join命令也能做简单的连接操作。
首先,看一下join命令的功能
join命令
功能说明:
将两个文件中,指定栏位内容相同的行连接起来。
语法:join [-i][-a<1|2>][-e<string>][-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 显示版本信息。
指定输出字段:
-o <FILENO.FIELDNO> ...
其中fileno=1表示第一个文件,fileno=2表示第二个文件,fieldno表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。
比如:-o 1.1 1.2 2.2 表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。
实例分析
join命令相当于sql中的内连接,但使用join命令前要求要连接的列是排好序的,所以未排序的文件可以先用sort命令排序。
sort命令说明:
选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同; -b :忽略最前面的空格符部分; -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; -n :使用『纯数字』进行排序(默认是以文字型态来排序的); -r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表; -t :分隔符,默认是用 [tab] 键来分隔; -k :以那个区间 (field) 来进行排序的意思
文件a.csv为
-1, id_1000453,computer_os_type_203,computer_browser_version_1421,
handle_92449, id_1000455,computer_os_type_201,computer_browser_version_1574
handle_62344, id_1000456,computer_os_type_203,computer_browser_version_377
handle_105086, id_1000458,computer_os_type_228,computer_browser_version_875
文件b.csv为
handle_92449, id_1000455,computer_os_type_201,computer_browser_version_1574
handle_59483, id_1000456,computer_os_type_203,computer_browser_version_377
首先,对a.csv和b.csv排序
$ sort -t , a.csv > a_sorted.csv
$ sort -t , b.csv > b_sorted.csv
对两文件连接
$ join -t , a_sorted.csv b_sorted.csv > a_b_row1_join.csv