2015-06-05 8 views
5

मेरे पास दो फाइलों को गठबंधन करने के लिए स्क्रिप्ट से नीचे है।लिनक्स अजीब दो फाइलों को मर्ज करें

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    

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 

वर्तमान कम्बाइन

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 आपरेशन है और वहाँ एक बहुत ही स्पष्ट नाम के साथ उस के लिए एक पूरी तरह से अच्छा यूनिक्स उपकरण है:

$ 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 सुनिश्चित करें कि key हम result में स्टोर 1 फ़ाइल से है बनाता है। हम लूप के माध्यम से पुन: प्रयास करने से पहले कुंजी मौजूद होने के लिए (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

आपके उत्तर के लिए धन्यवाद यह भी काम कर रहा है :) –

संबंधित मुद्दे