join 練習(xí)
兩文件如下:t1.txt(tab 隔開(kāi)每一列)
學(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
(但是不明覺(jué)厲)
join 的案例
例如有文件 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è)文件,它們將以行開(kāi)頭相同的內(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)的意義給出一定的解釋: 語(yǔ) 法:
join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<欄位>][-2<欄位>][--help][--version][文件1][文件2]
補(bǔ)充說(shuō)明:找出兩個(gè)文件中,指定欄位內(nèi)容相同的行,并加以合并,再輸出到標(biāo)準(zhǔn)輸出設(shè)備。
參 數(shù):
-a<1 或 2> 除了顯示原來(lái)的輸出內(nèi)容之外,還顯示指令文件中沒(méi)有相同欄位的行。
-e<字符串> 若[文件 1]與[文件 2]中找不到指定的欄位,則在輸出中填入選項(xiàng)中的字符串。
-i 或--igore-case 比較欄位內(nèi)容時(shí),忽略大小寫(xiě)的差異。
-o<格式> 按照指定的格式來(lái)顯示結(jié)果。
-t<字符> 使用欄位的分隔字符。
-v<1 或 2> 跟-a 相同,但是只顯示文件中沒(méi)有相同欄位的行。
-1<欄位> 連接[文件 1]指定的欄位。
-2<欄位> 連接[文件 2]指定的欄位。
--help 顯示幫助。
--version 顯示版本信息。
有沒(méi)有發(fā)現(xiàn)一個(gè)問(wèn)題,就是只能按照我寫(xiě)的來(lái),稍微換換命令的參數(shù)就會(huì)出現(xiàn)說(shuō)文件沒(méi)有進(jìn)行排序的提示?
需要注意的是,使用join連接兩個(gè)文件的相關(guān)字段,都需要先進(jìn)行排序。如果連接的主字段有重復(fù),則會(huì)導(dǎo)致兩個(gè)文件相關(guān)行的排列組合,請(qǐng)確保這是你需要的結(jié)果。
另外如果你想使用-e 選項(xiàng),需要使用-o 選項(xiàng)來(lái)格式化列,否則-e 是沒(méi)有效果的。還有一點(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)測(cè)試。
個(gè)人認(rèn)為這是join命令的一點(diǎn)瑕疵,他應(yīng)該兩個(gè)文件如果全連接或者左連接右連接出現(xiàn)單獨(dú)的關(guān)鍵鍵都應(yīng)該是關(guān)鍵鍵名稱(chēng)而不是-e補(bǔ)充。不過(guò)這個(gè)瑕疵可以用awk來(lái)彌補(bǔ)一下,倒是挺容易。
join 命令,對(duì)文件格式的要求非常強(qiáng),如果想要更靈活的使用,可用 AWK 命令,參加 AWK 實(shí)例.
join 標(biāo)準(zhǔn)輸入
有時(shí)我們需要將多個(gè)格式相同的文件 join 到一起,而 join 接受的是兩個(gè)文件的指令,此時(shí)我們可以使用管道和字符“-"
來(lái)實(shí)現(xiàn)join file1 file2 | join - file3 | join - file4
這樣就可以將四個(gè)文件 連接到 一起了。
大體介紹了一下 join ,然后介紹一下和 join 非常類(lèi)似的一個(gè)命令:paste
paste 將幾個(gè)文件的相應(yīng)行用制表符連接起來(lái),并輸出到標(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
2.將兩個(gè)文件合并,中間用 tab 鍵分隔開(kāi)。
代碼示例:
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
3.將 三個(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
感覺(jué) paste 沒(méi)什么難度.
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
詳解:
paste 是linux 命令
用途
從一個(gè)或多個(gè)文件中連接行。
語(yǔ)法
paste [ -s ] [ -d List ] File1 ...
描述
paste 命令從在命令行上指定的文件中讀取輸入。如果出現(xiàn) - (減號(hào))作為文件名,此命令從標(biāo)準(zhǔn)輸入中讀取。此命令連接給定的文件中的行并把結(jié)果行寫(xiě)到標(biāo)準(zhǔn)輸出中。
缺省情況下, paste 命令把每個(gè)文件當(dāng)作欄,并用制表符水平連接它們(并行合并)。可以把 paste 命令看作為 cat 命令(垂直連接,也就是一個(gè)接一個(gè))的相對(duì)命令。
使用 -s 標(biāo)志, paste 命令合并同一輸入文件的后繼行(串行合并)。缺省情況下,這些行用制表符連接。
下列特殊字符也可用在 List 參數(shù)中:
\n 換行符
\t 制表符
\ 反斜杠
\0 空字符串(不是空字符)