用Linux命令对两个文件进行连接操作

数据库做两个表的连接操作很方便。如果不用数据库,用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

 

posted @ 2015-07-23 09:22  lkprof  阅读(1479)  评论(0编辑  收藏  举报