鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開(kāi)頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問(wèn)題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號(hào)展開(kāi)與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語(yǔ)句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語(yǔ)句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)十六天---join 練習(xí)

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

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 空字符串(不是空字符)