Linux下常用的数据文件是格式化的,多个字段之间通过统一的分隔符来区分,常见的分隔符有冒号(:)、制表符、空格等。例如,MySQL数据库使用into outfile命令导出来的数据就是以制表符分隔的,/etc/passwd和/etc/group文件就是用冒号(:)来分隔的。这种格式化的文本既方便阅读也适合程序处理,通常有一列形如数据库中的关键字,如/etc/passwd表示用户名的第一列就为关键字。join命令就是一个根据关键字合并两个数据文件的命令,类似于数据库操作中两张表的关联查询。
join命令根据公共字段(关键字)来合并两个文件中的对应行,最常见的情况是指定两个数据文件名,这两个文件的第一列就是公共字段(关键字),字段之间以空白分隔。需要特别注意的是,在使用join命令之前,文件内容中的公共字段(关键字)应该排序,否则某些对比的项目将被略过。
常用参数:
-a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。 -t<字符> 指定分隔符,若不指定则默认分隔符为空白符 -i 比较公共字段(关键字)内容时,忽略大小写的差异 -o <FILENO.FIELDNO> 指定输出字段,其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号,默认会全部输出,但关键字列只输出一次 -1<m> 以第一个文件的第m栏为公共字段(关键字) -2<n> 以第二个文件的第n栏为公共字段(关键字)
应用实例:
1、测试-a跟-o参数,将两个中英文月份列表文件按序号合并
trevor@trevor-PC:~/linux/linux100$ join month_cn month_en 1 一月 January 2 二月 February 3 三月 March trevor@trevor-PC:~/linux/linux100$ join month_en month_cn 1 January 一月 2 February 二月 3 March 三月 trevor@trevor-PC:~/linux/linux100$ join -a1 month_cn month_en 1 一月 January 2 二月 February 3 三月 March 13 十三月,故意的 trevor@trevor-PC:~/linux/linux100$ join -a2 month_cn month_en 1 一月 January 2 二月 February 3 三月 March 14 MonthUnknown trevor@trevor-PC:~/linux/linux100$ join -a1 -a2 month_cn month_en 1 一月 January 2 二月 February 3 三月 March 13 十三月,故意的 14 MonthUnknown trevor@trevor-PC:~/linux/linux100$ join -o 1.1 2.2 month_cn month_en 1 January 2 February 3 March trevor@trevor-PC:~/linux/linux100$ join -o 1.1 2.2 1.2 month_cn month_en 1 January 一月 2 February 二月 3 March 三月 trevor@trevor-PC:~/linux/linux100$
2、测试参数-1、-2跟-t,将/etc/passwd文件跟/etc/group文件中的前三行按GID为公共字段(关键字)来合并
trevor@trevor-PC:~/linux/linux100$ head -n 3 /etc/passwd | tee passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh trevor@trevor-PC:~/linux/linux100$ head -n 3 /etc/group | tee group root:x:0: daemon:x:1: bin:x:2: trevor@trevor-PC:~/linux/linux100$ join -t ':' -1 4 passwd -2 3 group 0:root:x:0:root:/root:/bin/bash:root:x: 1:daemon:x:1:daemon:/usr/sbin:/bin/sh:daemon:x: 2:bin:x:2:bin:/bin:/bin/sh:bin:x: trevor@trevor-PC:~/linux/linux100$
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。