2012-11-14 9 views
16

में दो फ़ाइलों पर बाएं बाहरी जुड़ें मुझे दो फ़ील्ड पर दो फाइलों में शामिल होने की आवश्यकता है। हालांकि, मुझे फ़ाइल 1 में सभी मानों को पुनर्प्राप्त करना चाहिए, भले ही शामिल होने से बाएं बाहरी जुड़ने की तरह विफल हो जाए।यूनिक्स

फ़ाइल 1:

01|a|jack|d 
02|b|ron|c 
03|d|tom|e 

फ़ाइल 2:

01|a|nemesis|f 
02|b|brave|d 
04|d|gorr|h 

उत्पादन:

01|a|jack|d|nemesis|f 
02|b|ron|c|brave|d 
03|d|tom|e|| 

उत्तर

19

यह join -t '|' file1 file2 -a1

विकल्प का प्रयोग किया:

+०१२३५१६४१०६१

टी: डेलीमीटर।
: फ़ाइल नंबर का निर्णय लेता है जिससे अनपेक्षित लाइनों को मुद्रित किया जाना चाहिए।

join -t '|' file1 file2 -a2सही बाहरी में शामिल होगा।

नमूना रन

[[email protected] test]$ cat f1 
    01|a|jack|d 

    02|b|ron|c 

    03|d|tom|e 
    [[email protected] test]$ cat f2 
    01|a|nemesis|f 

    02|b|brave|d 

    04|d|gorr|h 
    [[email protected] test]$ join -t '|' f1 f2 -a1 
    01|a|jack|d|a|nemesis|f 

    02|b|ron|c|b|brave|d 

    03|d|tom|e 
+1

तुम सही हो, अपने उत्पादन अपने उत्पादन से मेल खाता है। मामला समाप्त। आप सभी को शुभकामनायें। – shellter

+0

@shellter। काफी नहीं। आईडीएम के पद में संबोधित एक मैच के बिना रिकॉर्ड के अंत में एक लापता पाइप है। फिर भी, मैं लिनक्स बाहरी जुड़ने के समारोह को ढूंढने के कूल्हे पर अधिकतर लोगों को पाने की रणनीति बनाने के लिए इसे एक बना देता हूं। –

4

वास्तव में ऐसा करने के लिए क्या प्रश्न पूछता पिछले जवाब से थोड़ा अधिक जटिल है और कुछ इस तरह की आवश्यकता होगी:

sed 's/|/:/2' file1 | sort -t: >file1.tmp 
sed 's/|/:/2' file2 | sort -t: >file2.tmp 
join -t':' file1.tmp file2.tmp -a1 -e'|' -o'0,1.2,2.2' | tr ':' '|' 

यूनिक्स में शामिल होने पर ही शामिल हो सकते हैं एक फ़ील्ड AFAIK ताकि आपको उन फ़ाइलों का उपयोग करना चाहिए जो "दो फ़ील्ड में दो फाइलों में शामिल हों," में एक अलग डिलीमीटर का उपयोग करें, इस मामले में पहले दो फ़ील्ड। मैं एक कोलन : का उपयोग करूंगा, हालांकि : किसी भी इनपुट में मौजूद है जिसमें आपको कुछ और उपयोग करने की आवश्यकता होगी, उदाहरण के लिए एक टैब वर्ण उत्पादन के उपयोग के लिए बेहतर विकल्प हो सकता है। मैं नए कंपाउंड फ़ील्ड, sort -t: पर आउटपुट को दोबारा सॉर्ट करता हूं, उदाहरण के लिए इनपुट फाइलों में कोई फर्क नहीं पड़ता है लेकिन असली दुनिया डेटा के लिए होगा। sed 's/|/:/2' फ़ाइल में प्रत्येक पंक्ति पर कोलन के साथ पाइप की दूसरी घटना को प्रतिस्थापित करता है।

file1.tmp

01|a:jack|d 
02|b:ron|c 
03|d:tom|e 

file2.tmp

01|a:nemesis|f 
02|b:brave|d 
04|d:gorr|h 

join उत्पादन के लिए कुछ और उन्नत विकल्पों के साथ tr द्वारा फ़िल्टर अब हम का उपयोग करें:

  • -t':' अंतरिम बृहदान्त्र निर्दिष्ट डेलीमीटर
  • -a1 बाएं बाहरी शामिल
  • -e'|' असफल जुड़ने के लिए प्रतिस्थापन स्ट्रिंग निर्दिष्ट करता है, मूल रूप से अंतिम आउटपुट डिलीमीटर एन -1 बार जहां एन पाइप सीमित फ़ील्ड की संख्या फ़ाइल 2.tmp में कोलन के दाईं ओर शामिल होती है। इस मामले में एन = 2 तो एक पाइप चरित्र।
  • -o'0,1.2,2.2' निर्दिष्ट करता है उत्पादन प्रारूप:
    • 0 में शामिल होने के क्षेत्र
    • 1.2 क्षेत्र file1.tmp के 2, यानी पेट के
    • के अधिकार सब कुछ
    • 2.2 क्षेत्र file2.tmp
  • tr ':' '|' के 2 अंत में हम अंतिम आउटपुट के लिए कोलों को पाइप में वापस अनुवाद करते हैं।

उत्पादन अब से मेल खाता सवाल नमूना उत्पादन बिल्कुल जो पिछले जवाब नहीं किया:

01|a|jack|d|nemesis|f 
02|b|ron|c|brave|d 
03|d|tom|e|| 
+0

अच्छी तरह से प्रतिक्रिया व्यक्त की, और हर विवरण के उत्कृष्ट स्पष्टीकरण। –