1. 程式人生 > >LINUX下按key合併——join命令

LINUX下按key合併——join命令

join命令
功能:“將兩個檔案裡指定欄位同樣的行連線起來”,即依照兩個檔案裡共有的某一列,將相應的行拼接成一行。
join [options] file1 file2
注:這兩個檔案必須在已經在此列上是依照同樣的規則進行了排序。
join選項
-a FILENUM:除了顯示匹配好的行另外將指定序號(1或2)檔案裡部匹配的行顯示出來
-e EMPTY:將須要顯示可是檔案裡不存在的域用此選項指定的字元取代
-i :忽略大寫和小寫
-j FIELD :等同於 -1 FIELD -2 FIELD,-j指定一個域作為匹配欄位
-o FORMAT:以指定格式輸出
-t CHAR :以指定字元作為輸入輸出的分隔符
join 預設以空白字元做分隔符(空格和\t),能夠使用 join -t $'\t'來指定使用tab做分隔符
-v FILENUM:與-a相似 但值顯示檔案裡沒匹配上的行
-1 FIELD:以file1中FIELD欄位進行匹配
-2 FIELD:以file2中FIELD欄位進行匹配
--help :列印命令幫助檔案
樣例:
檔案 file1.txt
aa 1 2
bb 2 3
cc 4 6
dd 3 3
檔案file2.txt
aa 2 1
bb 8 2
ff 2 4
cc 4 4
dd 5 5

1.join file1.txt file2.txt
輸出:aa 1 2 2 1
bb 2 3 8 2
預設已兩個檔案的第一行做匹配欄位,預設以空格(不限個數)做分隔符。
2.join -j 1 file1.txt file2.txt
輸出:aa 1 2 2 1
bb 2 3 8 9
-j選項 指定了以兩個檔案裡第一列做匹配欄位 等同於join file1.txt file2.txt
3. join -1 2 -2 3 file1.txt file2.txt
輸出: 1 aa 2 aa 2
2 bb 3 bb 8
4 cc 6 ff 2 
4 cc 6 cc 4
以第一個檔案的第二列和第二個檔案的第三列做匹配欄位。因為第二個檔案裡第三列的兩個3 都與第一個檔案裡第三行因此輸出
4 cc 6 ff 2 
4 cc 6 cc 4
4 join -o 1.1 -o 1.2 -o 1.3 -o 2.1 -o 2.2 -o 2.3 -e 'empty' -a 1 file1.txt file2.txt 
輸出: aa 1 2 aa 2 1
bb 2 3 bb 8 2
cc 4 6 empty empty empty
dd 3 3 empty empty empty
-o 指定 將file1的1,2,3列,file2的1,2,3 列都輸出。-a指定將file1中不匹配的行也輸出,可是file2中沒有與file1後兩行相應的欄位,因此使用empty補齊。

5.join -v 1 file1.txt file2.txt 
輸出: cc 4 6
dd 3 3
-v 1 將file1中不匹配的行輸出
PS:join命令和資料庫中的join命令很相似。
儘管file1和file2都已經排序,可是因為在第三行時開始不匹配因此僅僅匹配上了前兩行,後面的行儘管欄位也能夠相應可是以不能匹配。join命令,對檔案格式的要求很強,假設想要更靈活的使用,可用AWK命令,參加AWK例項

6. join 標準輸入
有時我們須要將多個格式同樣的檔案join到一起,而join接受的是兩個檔案的指令,此時我們能夠使用管道和字元“-"來實現
join file1 file2 | join - file3 | join - file4 
這樣就能夠將四個檔案 連線到 一起了。

轉自http://www.cnblogs.com/mfryf/p/3402200.html