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

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

join 練習(xí)

兩文件如下: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(但是不明覺厲)

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è)文件,它們將以行開頭相同的內(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ù)

  • -a<1 或 2> 除了顯示原來的輸出內(nèi)容之外,還顯示指令文件中沒有相同欄位的行。
  • -e< 字符串 > 若 [文件 1] 與 [文件 2] 中找不到指定的欄位,則在輸出中填入選項(xiàng)中的字符串。
  • -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í)例。

join 標(biāo)準(zhǔn)輸入

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