兩文件如下:t1.txt(tab 隔開每一列)
學(xué)號(hào) 姓名
001 xiaoming
002 zhangsan
t2.txt
科目號(hào) 學(xué)號(hào) 分?jǐn)?shù)
0001 001 90
0002 001 80
0001 002 90
0002 002 100
合并為:
0001 001 xiaoming 90
0002 001 xiaoming 80
0001 002 zhangsan 90
0002 002 lisi 100
做法是:join -2 2 t1.txt t2.txt
(但是不明覺厲)
例如有文件 aa 和 bb
aa 的內(nèi)容為:
joe 100
jane 200
herman 300
chris 400
bb 的內(nèi)容為:
joe 20
jane 10
syx 90
chris 98
如果使用命令 join aa bb,則輸出結(jié)果為:
我們默認(rèn)合并兩個(gè)文件,它們將以行開頭相同的內(nèi)容為對(duì)照,如果一樣,則抵消,把不同的合并為同一行。
chris 400 98
jane 200 10
joe 100 20
如果使用命令 join -a1 aa bb,則輸出結(jié)果為:
chris 400 98
herman 300
jane 200 10
joe 100 20
使用 -a1 選項(xiàng)的意義是: 以第一個(gè)文件為主要內(nèi)容合并,顯示第一個(gè)文件的所有內(nèi)容,不顯示第二個(gè)文件不匹配規(guī)則的內(nèi)容,(匹配規(guī)則為:行頭一樣,則允許合并,每行后續(xù)不同內(nèi)容合并一起,相同的抵消)
如果使用命令 join -a2 aa bb,則輸出結(jié)果為
chris 400 98
jane 200 10
joe 100 20
syx 90
使用 -a2 選項(xiàng)的意義: 以第二個(gè)文件為主要內(nèi)容合并,顯示第二個(gè)文件的所有內(nèi)容,不顯示第一個(gè)文件不匹配規(guī)則的內(nèi)容,(匹配規(guī)則為:行頭一樣,則允許合并,每行后續(xù)不同內(nèi)容合并一起,相同的抵消)
如果使用 join -a1 -a2 aa bb
chris 400 98
herman 300
jane 200 10
joe 100 20
syx 90
使用 -a1 -a2 選項(xiàng)的意義是: 合并兩個(gè)文件的所有內(nèi)容,但不符合規(guī)則的,則各自為一行。
如果使用命令 join -o 1.1 2.2,輸出結(jié)果為:
chris 98
jane 10
joe 20
使用該選項(xiàng)的意義是: 使用自定義合并隊(duì)列選項(xiàng),1.1 代表第一個(gè)文件的第一列,2.2 代表第二個(gè)文件的第二列
如果輸入命令 join -t ’ ’ -o 1.1 2.2 aa bb,輸出結(jié)果為:
chris 98
jane 10
joe 20
使用該選項(xiàng)的意義是:使用分隔符,將會(huì)更加精確的定位合并內(nèi)容。
最后針對(duì)一下 join 各個(gè)選項(xiàng)的意義給出一定的解釋:
語法:
join [-i][-a<1 或 2>][-e< 字符串 >][-o< 格式 >][-t< 字符 >][-v<1 或 2>][-1< 欄位 >][-2< 欄位 >][--help][--version][文件 1][文件 2]
補(bǔ)充說明:找出兩個(gè)文件中,指定欄位內(nèi)容相同的行,并加以合并,再輸出到標(biāo)準(zhǔn)輸出設(shè)備。
參數(shù):
-i
或 --igore-case
比較欄位內(nèi)容時(shí),忽略大小寫的差異。 -o
< 格式 > 按照指定的格式來顯示結(jié)果。-t
< 字符 > 使用欄位的分隔字符。-v
<1 或 2> 跟 -a 相同,但是只顯示文件中沒有相同欄位的行。-1
< 欄位 > 連接 [文件 1] 指定的欄位。-2
< 欄位 > 連接 [文件 2] 指定的欄位。help
顯示幫助。version
顯示版本信息。有沒有發(fā)現(xiàn)一個(gè)問題,就是只能按照我寫的來,稍微換換命令的參數(shù)就會(huì)出現(xiàn)說文件沒有進(jìn)行排序的提示?
需要注意的是,使用 join 連接兩個(gè)文件的相關(guān)字段,都需要先進(jìn)行排序。如果連接的主字段有重復(fù),則會(huì)導(dǎo)致兩個(gè)文件相關(guān)行的排列組合,請(qǐng)確保這是你需要的結(jié)果。
另外如果你想使用 -e
選項(xiàng),需要使用 -o
選項(xiàng)來格式化列,否則 -e
是沒有效果的。還有一點(diǎn)就是你會(huì)發(fā)現(xiàn)使用 -e -o
進(jìn)行全連接的話,兩個(gè)文件的關(guān)鍵列都必須使用上,負(fù)責(zé) -e
會(huì)把缺失的關(guān)鍵列那也填補(bǔ)上相應(yīng)的字符,有時(shí)候這并非我們期望的,具體的請(qǐng)自己行試驗(yàn)測試。
個(gè)人認(rèn)為這是 join 命令的一點(diǎn)瑕疵,他應(yīng)該兩個(gè)文件如果全連接或者左連接右連接出現(xiàn)單獨(dú)的關(guān)鍵鍵都應(yīng)該是關(guān)鍵鍵名稱而不是 -e
補(bǔ)充。不過這個(gè)瑕疵可以用 awk
來彌補(bǔ)一下,倒是挺容易。
join 命令,對(duì)文件格式的要求非常強(qiáng),如果想要更靈活的使用,可用 AWK 命令,參加 AWK 實(shí)例。
有時(shí)我們需要將多個(gè)格式相同的文件 join 到一起,而 join 接受的是兩個(gè)文件的指令,此時(shí)我們可以使用管道和字符 “-",來實(shí)現(xiàn) join file1 file2 | join - file3 | join - file4
這樣就可以將四個(gè)文件 連接到 一起了。
大體介紹了一下 join,然后介紹一下和 join 非常類似的一個(gè)命令:paste
paste
將幾個(gè)文件的相應(yīng)行用制表符連接起來,并輸出到標(biāo)準(zhǔn)輸出。 paste
[選項(xiàng)] file1 file2 -d
指定不同于空格或 tab 鍵的域分隔符。例如用#分隔域,
使用 -d#-s
將每個(gè)文件合并成行而不是按行粘 代碼示例:
[root@jbxue ~]# cat names
Tony
Emanuel
Lucy
Ralph
Fred
[root@jbxue ~]# cat numbers
(307) 555-5356
(212) 555-3456
(212) 555-9959
(212) 555-7741
(212) 555-0040
將兩個(gè)文件合并,中間用 tab 鍵分隔開
代碼示例:
paste names numbers
Tony (307) 555-5356
Emanuel (212) 555-3456
Lucy (212) 555-9959
Ralph (212) 555-7741
Fred (212) 555-0040
cat addresses
55-23 Vine Street,Miami
39 University Place,New York
17 E. 25th Street,New York
38 Chauncey St.,Bensonhurst
17 E. 25th Street,New York
將 三個(gè)文件合并
代碼示例:
paste names addresses numbers
Tony 55-23 Vine Street,Miami (307) 555-5356
Emanuel 39 University Place,New York (212)
555-3456
Lucy 17 E. 25th Street,New York (212) 555-9959
Ralph 38 Chauncey St.,Bensonhurst (212) 555-7741
Fred 17 E. 25th Street,New York (212) 555-0040
感覺 paste 沒什么難度。
paste 練習(xí)
文件 aa 的內(nèi)容為:
123
aaa
文件 bb 的內(nèi)容為:
456
bbb
bbb
使用命令 paste -s aa bb,輸出結(jié)果為
123 aaa
456 bbb bbb
使用 paste -d ”#” aa bb,輸出結(jié)果為:
123#456
aaa#bbb
#bbb
詳解:
paste 是 linux 命令
用途:
從一個(gè)或多個(gè)文件中連接行。
語法:
paste [-s] [-d List] File1 ...
描述:
paste 命令從在命令行上指定的文件中讀取輸入。如果出現(xiàn) -(減號(hào))作為文件名,此命令從標(biāo)準(zhǔn)輸入中讀取。此命令連接給定的文件中的行并把結(jié)果行寫到標(biāo)準(zhǔn)輸出中。
缺省情況下,paste 命令把每個(gè)文件當(dāng)作欄,并用制表符水平連接它們(并行合并)。可以把 paste 命令看作為 cat 命令(垂直連接,也就是一個(gè)接一個(gè))的相對(duì)命令。
使用 -s
標(biāo)志,paste
命令合并同一輸入文件的后繼行(串行合并)。缺省情況下,這些行用制表符連接。
下列特殊字符也可用在 List 參數(shù)中:
\n
換行符\t
制表符\\
反斜杠\0
空字符串(不是空字符)