2015-06-05 84 views
5

我有下面的腳本來合併兩個文件。Linux awk合併兩個文件

awk -F"\t" ' 
    {key = $1} 
    !(key in result) {result[key] = $0; next;} 
    { for (i=2; i <= NF; i++) result[key] = result[key] FS $i } 
    END { 
     PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk 
     for (key in result) print result[key] 
    } 
' $1 $2 > $3 

第一列是關鍵字,並且都是$ 1和$ 2。 但是,如果$ 2列有一個鍵,但$ 1列沒有鍵。

然後它也是合併,除了$ 1行。

我想只合並$ 1密鑰存在。 我怎樣才能簡單地結合這兩個文件?

例如,

文件1

Key Column1 Column2 Column3 
Test1 500  400  200    
Test2 499  400  200    
Test5 600  200  150    
Test6 600  199  150    
Test7 599  199  100    

文件2

Key Column4 Column5 
Test1 Good  Good      
Test2 Good  Good 
Test3 Good  Good      
Test4 Good  Good 
Test5 Good  Good      
Test6 Good  Good 
Test7 Good  Good 

電流聯合

Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good  
Test2 499  400  200  Good  Good  
Test5 600  200  150  Good  Good   
Test6 600  199  150  Good  Good   
Test7 599  199  100  Good  Good 
Test3 Good Good 
Test4 Good Good 

預期聯合。

Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good  
Test2 499  400  200  Good  Good  
Test5 600  200  150  Good  Good   
Test6 600  199  150  Good  Good   
Test7 599  199  100  Good  Good 

謝謝!

+0

句子'第一列關鍵和$ 1和$ 2。但是,如果$ 2列有一個鍵,但$ 1列沒有鍵。那麼除了1美元行外,它也是合併的。「並不意味着什麼。你應該改變它們以反映你的意思或只是刪除它們。 –

回答

7

你要對這個錯誤的。你所描述的是一個join操作,有​​一個完美的UNIX工具,使得具有非常明顯的名稱:

$ join file1 file2 | column -t 
Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good 
Test2 499  400  200  Good  Good 
Test5 600  200  150  Good  Good 
Test6 600  199  150  Good  Good 
Test7 599  199  100  Good  Good 

,或者如果你堅持AWK:

$ awk 'NR==FNR{m[$1]=$2" "$3; next} {print $0, m[$1]}' file2 file1 | column -t 
Key Column1 Column2 Column3 Column4 Column5 
Test1 500  400  200  Good  Good 
Test2 499  400  200  Good  Good 
Test5 600  200  150  Good  Good 
Test6 600  199  150  Good  Good 
Test7 599  199  100  Good  Good 
+0

謝謝你這是工作 –

4

存入數組

{key = $1} 
!(key in result) && NR == FNR {result[key] = $0; next;} 
(key in result) { for (i=2; i <= NF; i++) { 
    result[key] = result[key] FS $i 
    } 
} 
END { 
    PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk 
    for (key in result) print result[key] 
} 

時添加的條件的NR == FNR可以確保我們存入resultkey是從第一個文件。在迭代for循環之前,我們還添加了(key in result)以確保密鑰存在。

4

你可以試試下面的命令:

awk ' 
    BEGIN { FS = OFS = "\t" } 
    {key = $1} 
    FNR == NR {result[key] = $0; next;} 
    (key in result) { for (i=2; i <= NF; i++) result[key] = result[key] FS $i } 
    END { 
     PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk 
     for (key in result) print result[key] 
    } 
' file1 file2 

我已經改變了這些檢查。 FNR == NR只保存在第一個文件的result行中。並且(key in result)適用於第二個文件,並且僅附加先前在第一個文件中找到的那些鍵的列。

它產生:

Key  Column1 Column2 Column3   Column4 Column5 
Test1 500  400  200    Good Good 
Test2 499  400  200    Good Good 
Test5 600  200  150    Good Good 
Test6 600  199  150    Good Good 
Test7 599  199  100    Good Good 
+0

謝謝你的回答,這也是工作:) –