पहले कॉलम के आधार पर डुप्लिकेट लाइनों के बिना 2 फ़ाइलों को सॉर्ट और मर्ज करें


12

मेरे पास सभी परीक्षण नाम के साथ एक फ़ाइल है:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

और परीक्षण नाम और संबंधित परिणाम से युक्त एक और फ़ाइल:

$ cat completed_tests.txt
test1 Passed
test3 Failed
test5 Passed
test6 Passed

डुप्लिकेट के बिना संबंधित परिणाम के साथ सभी परीक्षण नामों वाली एक नई फ़ाइल कैसे बनाएं?

यदि मैं निष्पादित करता हूं:

sort all_tests.txt completed_tests.txt

आउटपुट में डुप्लिकेट शामिल हैं:

test1 
test1 Passed
test2
test3 
test3 Failed
test4
test5 
test5 Passed
test6 
test6 Passed

वांछित उत्पादन:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

जवाबों:


17

लगता है कि आप इसे joinबहुत आसानी से प्राप्त कर सकते हैं अगर फाइलें दोनों को क्रमबद्ध करें।

$ join -a 1 all_test.txt completed_test.txt
test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

-a 1 1 फ़ाइल से प्रिंट लाइनों का मतलब है कि उनके साथ कुछ भी शामिल नहीं था।

यदि आपकी फ़ाइलें पहले से ही सॉर्ट नहीं की गई हैं, तो आप इसका उपयोग कर सकते हैं (धन्यवाद टेराडॉन!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )

7

यहाँ सही उपकरण है joinके रूप में सुझाव दिया @Zanna द्वारा, लेकिन यहाँ एक है awkदृष्टिकोण:

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,a[$1]}' completed_tests.txt all_tests.txt 
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

2

पर्ल

प्रभावी रूप से, यह टेर्डन के उत्तर का एक बंदरगाह है:

$ perl -lane '$t+=1; $h{$F[0]}=$F[1] if $.==$t; print $F[0]," ",$h{$F[0]} if $t!=$.;$.=0 if eof' completed_tests.txt all_tests.txt          
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

यह परीक्षण-स्थिति जोड़े के हैश से निर्माण करता है completed_test.txtऔर फिर all_tests.txtउस हैश में लाइनों को देखता है। $tप्रत्येक फ़ाइल से संसाधित कुल पंक्तियों का चर और $.जो फ़ाइल के अंत तक पहुंचने पर रीसेट हो जाता है, हमें इस बात पर नज़र रखने की अनुमति देता है कि वर्तमान में कौन सी फ़ाइल पढ़ी गई है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.