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