一天一條Linux指令 join

2021-07-24 08:16:33 字數 4406 閱讀 3273

linux下最常用的資料檔案格式是文字格式的,多個字段之間通過分隔符來區分,分隔符比如冒號(:)、製表符、空格等。/etc/passwd和/etc/group就是用:來分隔的,用mysql的into outfile指令匯出的資料通常是以製表符分隔的。這種文字格式既方便人去閱讀,也適合程式處理,通常某列類似於資料庫中的關鍵字。join命令就是乙個根據關鍵字合併資料檔案的命令(join lines of two files on a common field),類似於資料庫中兩張表關聯查詢。

join命令根據公共字段(關鍵字)來合併兩個檔案的資料行。因此最簡單的使用方式就是指定兩個資料檔名,這兩個檔案的第一列就是公共字段,字段之間以空白分隔。(for  each  pair  of  input lines with identical join fields, write a line to standard output.  the default join field is the first, delimited by whitespace.  when file1 or file2 (not both) is -, read standard input.)

內連線(inner join)                                      格式:join

左連線(left join, 左外連線, left outer join)     格式:join -a1

右連線(right join, 右外連線,right outer join)  格式:join -a2

全連線(full join, 全外連線, full outer join)      格式:join -a1 -a2

指定分隔符:

-t 比如:-t ':' 使用冒號作為分隔符。預設的分隔符是空白。

指定輸出字段:

-o ...

其中fileno=1表示第乙個檔案,fileno=2表示第二個檔案,fieldno表示字段序號,從1開始編號。缺省會全部輸出,但關鍵字列只輸出一次。

比如:-o 1.1 1.2 2.2 表示輸出第乙個檔案的第乙個字段、第二個字段,第二個檔案的第二個字段。

不指定任何引數的情況下使用join命令,就相當於資料庫中的內連線,關鍵字不匹配的行不會輸出。

[root@rhel55 linux]# cat month_cn.txt 

1       一月

2       二月

3       三月

4       四月

5       五月

6       六月

7       七月

8       八月

9       九月

10      十月

11      十一月

12      十二月

13      十三月,故意的

[root@rhel55 linux]# cat month_en.txt 

1       january

2       february

3       march

4       april

5       may

6       june

7       july

8       august

9       september

10      october

11              november

12      december

14      monthunknown

注:注意兩個檔案的內容,中文版的多了十三月,英文版的多了14月,這純粹是為了方便演示。

[root@rhel55 linux]# join month_cn.txt month_en.txt  

1 一月 january

2 二月 february

3 三月 march

4 四月 april

5 五月 may

6 六月 june

7 七月 july

8 八月 august

9 九月 september

10 十月 october

11 十一月 november

12 十二月 december

[root@rhel55 linux]#

顯示左邊檔案中的所有記錄,右邊檔案中沒有匹配的顯示空白。

[root@rhel55 linux]#join -a1 month_cn.txt month_en.txt   

1 一月 january

2 二月 february

3 三月 march

4 四月 april

5 五月 may

6 六月 june

7 七月 july

8 八月 august

9 九月 september

10 十月 october

11 十一月 november

12 十二月 december

13 十三月,故意的

[root@rhel55 linux]#

顯示右邊檔案中的所有記錄,左邊檔案中沒有匹配的顯示空白。

[root@rhel55 linux]# join -a2 month_cn.txt month_en.txt  

1 一月 january

2 二月 february

3 三月 march

4 四月 april

5 五月 may

6 六月 june

7 七月 july

8 八月 august

9 九月 september

10 十月 october

11 十一月 november

12 十二月 december

14 monthunknown

[root@rhel55 linux]#

[root@rhel55 linux]#join -a1 -a2 month_cn.txt month_en.txt 

1 一月 january

2 二月 february

3 三月 march

4 四月 april

5 五月 may

6 六月 june

7 七月 july

8 八月 august

9 九月 september

10 十月 october

11 十一月 november

12 十二月 december

13 十三月,故意的

14 monthunknown

[root@rhel55 linux]#

比如引數 -o 1.1 表示只輸出第乙個檔案的第乙個字段。

[root@rhel55 linux]# join -o 1.1 month_cn.txt month_en.txt 12

3456

78910

1112

[root@rhel55 linux]# join -o 1.1 2.2 month_cn.txt month_en.txt   

1 january

2 february

3 march

4 april

5 may

6 june

7 july

8 august

9 september

10 october

11 november

12 december

[root@rhel55 linux]# join -o 1.1 2.2 1.2 month_cn.txt month_en.txt

1 january 一月

2 february 二月

3 march 三月

4 april 四月

5 may 五月

6 june 六月

7 july 七月

8 august 八月

9 september 九月

10 october 十月

11 november 十一月

12 december 十二月

[root@rhel55 linux]# join -o 1.1 2.2 1.2 1.3 month_cn.txt month_en.txt   

<== 欄位1.3並不存在

1 january 一月 

2 february 二月 

3 march 三月 

4 april 四月 

5 may 五月 

6 june 六月 

7 july 七月 

8 august 八月 

9 september 九月 

10 october 十月 

11 november 十一月 

12 december 十二月 

[root@rhel55 linux]#

[root@rhel55 linux]# join -t ':' /etc/passwd /etc/shadow

一天一條Linux指令 cd

嵌入式開發需要不斷積累linux相關知識,所以在此天天不厭其煩 日積月累。cd change directory 命令是linux中最常用命令之一,我覺得另乙個應該是ls 後續介紹 主要功能是跳轉到cd命令指定目錄。cd命令格式 cd l p dir 常用cd命令 1.跳轉到指定目錄 cd dir ...

一天一條Linux指令 apt

由於昨天去assem公司除錯電路,接觸linux下依賴包的安裝大牛,遂整理了一下apt命令。apt get命令本身並不具有管理軟體包功能,只是提供了乙個軟體包管理的命令列平台。在這個平台上使用更豐富的子命令,完成具體的管理任務。apt get命令的一般語法格式為 apt get subcommand...

一天一條Linux指令 find

前言 我們為什麼要學會使用find命令?每一種作業系統都有成千上萬的檔案組成,對於linux這樣 一切皆檔案 的作業系統來說更不例外,大家應該都能很輕鬆使用windows下的檔案查詢功能,但是對linux這一功能可能並不是很熟悉,其實想玩linux的你更要牢牢掌握這個命令,因為linux不像wind...