日期:2014-05-16 浏览次数:20771 次
本文链接:http://codingstandards.iteye.com/blog/796299 ? (转载请注明出处)
?
Linux下最常用的数据文件格式是文本格式的,多个字段之间通过分隔符来区分,分隔符比如冒号(:)、制表符、空格等。/etc/passwd和/etc/group就是用:来分隔的,用MySQL的into outfile指令导出的数据通常是以制表符分隔的。这种文本格式既方便人去阅读,也适合程序处理,通常某列类似于数据库中的关键字。join命令就是一个根据关键字合并数据文件的命令(join lines of two files on a common field),类似于数据库中两张表关联查询。
join命令根据公共字段(关键字)来合并两个文件的数据行。因此最简单的使用方式就是指定两个数据文件名,这两个文件的第一列就是公共字段,字段之间以空白分隔。(For? each? pair? of? input lines with identical join fields, write a line to standard output.? The default join field is the first, delimited by whitespace.? When FILE1 or FILE2 (not both) is -, read standard input.)
内连接(inner join) ???????????????????????????????????? 格式:join <FILE1> <FILE2>
左连接(left join, 左外连接, left outer join)???? 格式:join -a1 <FILE1> <FILE2>
右连接(right join, 右外连接,right outer join)? 格式:join -a2 <FILE1> <FILE2>
全连接(full join, 全外连接, full outer join) ???? 格式:join -a1 -a2 <FILE1> <FILE2>
?
指定分隔符:
-t <CHAR>
比如:-t ':' 使用冒号作为分隔符。默认的分隔符是空白。
?
指定输出字段:
-o <FILENO.FIELDNO> ...
其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。
比如:-o 1.1 1.2 2.2 表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。
?
不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。
[root@rhel55 linux]# cat month_cn.txt
1?????? 一月
2?????? 二月
3?????? 三月
4?????? 四月
5?????? 五月
6?????? 六月
7?????? 七月
8?????? 八月
9?????? 九月
10????? 十月
11????? 十一月
12????? 十二月
13????? 十三月,故意的
[root@rhel55 linux]# cat month_en.txt
1?????? January
2?????? February
3?????? March
4?????? April
5?????? May
6?????? June
7?????? July
8?????? August
9?????? September
10????? October
11????????????? November
12????? December
14????? MonthUnknown
注:注意两个文件的内容,中文版的多了十三月,英文版的多了14月,这纯粹是为了方便演示。
[root@rhel55 linux]# join month_cn.txt month_en.txt?
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
[root@rhel55 linux]#
显示左边文件中的所有记录,右边文件中没有匹配的显示空白。
[root@rhel55 linux]# join -a1 month_cn.txt month_en.txt??
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月,故意的
[root@rhel55 linux]#
?
显示右边文件中的所有记录,左边文件中没有匹配的显示空白。
[root@rhel55 linux]# join -a2 month_cn.txt month_en.txt?
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
14 MonthUnknown
[root@rhel55 linux]#
?
[root@rhel55 linux]# join -a1 -a2 month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December