我用的命令:linux
join -t $'\t' -o 1.1 1.2 1.3 1.4 file1 file2數據庫
若是分隔符是tab鍵,不用指定-t參數的,會被當成空格處理,輸出的分隔符天然也是空格了。less
若是想輸出的分隔符是tab鍵,那麼就使用我上面的方法,-t $'\t' 參數。ide
Usage: join [OPTION]... FILE1 FILE2
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.
-a FILENUM print unpairable lines coming from file FILENUM, where
FILENUM is 1 or 2, corresponding to FILE1 or FILE2
-e EMPTY replace missing input fields with EMPTY
-i, --ignore-case ignore differences in case when comparing fields
-j FIELD equivalent to `-1 FIELD -2 FIELD'
-o FORMAT obey FORMAT while constructing output line
-t CHAR use CHAR as input and output field separator
-v FILENUM like -a FILENUM, but suppress joined output lines
-1 FIELD join on this FIELD of file 1
-2 FIELD join on this FIELD of file 2
--help display this help and exit
--version output version information and exit
Unless -t CHAR is given, leading blanks separate fields and are ignored,
else fields are separated by CHAR. Any FIELD is a field number counted
from 1. FORMAT is one or more comma or blank separated specifications,
each being `FILENUM.FIELD' or `0'. Default FORMAT outputs the join field,
the remaining fields from FILE1, the remaining fields from FILE2, all
separated by CHAR.
Important: FILE1 and FILE2 must be sorted on the join fields.ui
用途說明this
Linux下最經常使用的數據文件格式是文本格式的,多個字段之間經過分隔符來區分,分隔符好比冒號(:)、製表符、空格等。/etc/passwd和 /etc/group就是用:來分隔的,用MySQL的into outfile指令導出的數據一般是以製表符分隔的。這種文本格式既方便人去閱讀,也適合程序處理,一般某列相似於數據庫中的關鍵字。join命令就是一 個根據關鍵字合併數據文件的命令(join lines of two files on a common field),相似於數據庫中兩張表關聯查詢。spa
經常使用參數orm
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.)ci
內鏈接(inner join) 格式:join <FILE1> <FILE2>rem
左鏈接(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
13 十三月,故意的
14 MonthUnknown
[root@rhel55 linux]#
示例五 指定輸出字段
好比參數 -o 1.1 表示只輸出第一個文件的第一個字段。
[root@rhel55 linux]# join -o 1.1 month_cn.txt month_en.txt
1
2
3
4
5
6
7
8
9
10
11
12
[root@rhel55 linux]# join -o 1.1 2.2 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]# join -o 1.1 2.2 1.2 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]# join -o 1.1 2.2 1.2 1.3 month_cn.txt month_en.txt <== 字段1.3並不存在
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 -t ':' /etc/passwd /etc/shadow