2012-12-14 17 views
1

如何加入2個文件中殼,例如:加入2檔,以在外殼

文件1 -

server1   monthly  25 
server2   monthly  24 
server3   daily  21 
server4   weekly  7 
server5   weekly  7           

文件2 -

server1   monthly  5 
server2   monthly  4 
server3   daily  1 
server4   weekly  2 

能否請你幫我得到這樣的輸出:

server1   monthly  25  5 
server2   monthly  24  4 
server3   daily  21  1 
server4   weekly  7  2 
server5   weekly  7  0 
+0

server1的\t月25 server2的\t月24 server3的每日21 服務器4每週7 服務器5每週7 server1的\t每月5 server2的\t每月4 server3的每日1 服務器4每週2 server1的\t每月25 5 server2 \t每月24 4 server3每天21 1 server4每週7 2 server5每週7 0 – user1899817

回答

6

這是一個jo b。對於join

$ join -a 1 -a 2 -e 0 -o '1.1 1.2 1.3 2.3' file1 file2 
server1 monthly 25 5 
server2 monthly 24 4 
server3 daily 21 1 
server4 weekly 7 2 
server5 weekly 7 0 

管到column -t一個很好的格式化的表格:

$ join -a 1 -a 2 -e 0 -o '1.1 1.2 1.3 2.3' file file2 | column -t 
server1 monthly 25 5 
server2 monthly 24 4 
server3 daily 21 1 
server4 weekly 7 2 
server5 weekly 7 0 

使用重定向操作符,這個存儲到的newfile:

$ join -a 1 -a 2 -e 0 -o '1.1 1.2 1.3 2.3' file file2 | column -t > newfile 

說明:

-a   print unpairable lines from file FILENUM, where FILENUM is 
       1 or 2, corresponding to FILE1 or FILE2 

-e EMPTY  replace missing input fields with EMPTY 

-o FORMAT  obey FORMAT while constructing output line 

-a用於顯示線,如在file1server 5..其中沒有這樣的線在file2-e 0發現替換0-o任何空字段用於格式化輸出,其中1.1裝置file1 field 11.3裝置file1 field 3等。

注:join確實需要進行排序文件第一(他們已經在這種情況下)所以往往與使用sort命令的組合。

+0

這適用於示例數據,但我懷疑實際進程需要加入字段1和2(「server1 monthly」不應該與「server1 daily」加入)所以對輸入進行一些預處理是使用'join'所必需的。 –

+0

我認爲在這種情況下,樣本數據就是實際數據,例如''是我在編輯中添加的。如果這實際上是這種情況*(我懷疑我們會知道)*然後是一些預處理/後處理將是必需的。 –

3

下面是使用awk一個辦法:

awk 'FNR==NR { a[$1,$2]=$3; next } { print $0, (a[$1,$2] ? a[$1,$2] : "0") | "column -t" }' file2 file1 

結果:

server1 monthly 25 5 
server2 monthly 24 4 
server3 daily 21 1 
server4 weekly 7 2 
server5 weekly 7 0 

說明:

FNR == NR {...}是一個結構,它是唯一的真爲參數列表中的第一個文件
因此,對於第一個文件,我們添加列e和兩個分配第三列作爲值的數組。 「下一個」只是力awk來讀取輸入(因此,它跳過處理所述代碼的其餘部分)
一旦AWK已完成處理的第一個文件的下一行,它將移動到該第二文件

AWK現在將打印第二個文件中的每一行。 (x)a(b)
它只是表示:if(x)then(a)else(b)。我可以寫:

awk 'FNR==NR { a[$1,$2]=$3; next } { if (a[$1,$2]!=0) print $0, a[$1,$2]; else print $0, "0" }' file2 file1 | column -t 

...但ternaries很性感。

+0

許多Thanks..Awk適合我..但我試圖理解這裏的邏輯 – user1899817

+0

@ user1899817 awk是一個偉大的工具,可以讓你做強大的工具,但是'join'是爲了這個確切的目的而編寫的, ' - 幫助「和'人'頁面作爲參考,絕對是該工作的正確工具。 –

+0

謝謝很多Sudo_O -Join是很好的解釋,它也幫助我,但我仍然tyring瞭解awk的邏輯 – user1899817