2015-06-05 14 views
5

Tôi có kịch bản bên dưới để kết hợp hai tệp.Linux awk hợp nhất hai tệp

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 

Cột đầu tiên là khóa và cả $ 1 và $ 2. Nhưng nếu cột $ 2 có khóa nhưng cột $ 1 không có khóa.

sau đó cũng kết hợp ngoại trừ hàng $ 1.

Tôi muốn kết hợp chỉ có phím $ 1 đang tồn tại. Làm cách nào để kết hợp hai tệp này?

Ví dụ,

Tập 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    

File2

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

Current Kết hợp

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 

Dự kiến ​​Combine.

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 

Cảm ơn bạn!

+0

Các câu 'Cột đầu tiên là và cả $ 1 và $ 2. Nhưng nếu cột $ 2 có một khóa nhưng cột $ 1 không có khóa. sau đó cũng kết hợp ngoại trừ $ 1 row.' không có nghĩa là gì cả. Bạn nên thay đổi chúng để phản ánh ý của bạn hoặc chỉ xóa chúng. –

Trả lời

7

Bạn đang đi về sai này. Những gì bạn đang mô tả là một hoạt động join và có một công cụ UNIX hoàn toàn tốt cho điều đó với một cái tên rất rõ ràng:

$ 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 

hoặc nếu bạn nhấn mạnh vào 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

Cảm ơn bạn điều này đang hoạt động –

4

Thêm một điều kiện khi lưu trữ vào mảng

{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] 
} 

Các NR == FNR đảm bảo rằng các key chúng tôi lưu trữ vào result là từ tập tin 1st. Chúng tôi cũng thêm (key in result) để đảm bảo khóa tồn tại trước khi chúng tôi lặp qua vòng lặp for.

4

Bạn có thể thử lệnh sau:

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 

Tôi đã thay đổi những chi phiếu. Các FNR == NR chỉ tiết kiệm trong result dòng từ tập tin đầu tiên. Và (key in result) áp dụng cho tệp thứ hai và chỉ chắp thêm các cột cho các khóa được tìm thấy trước đó trong tệp đầu tiên.

Nó mang lại:

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

Cảm ơn bạn đã trả lời câu hỏi này cũng đang hoạt động :) –

Các vấn đề liên quan