2012-01-04 11 views
5

मेरे पास 2 निक्स फ़ाइलें हैं। सभी डेटा प्रत्येक फ़ाइल में एक पंक्ति पर है। प्रत्येक मान एक शून्य चरित्र से अलग होता है। डेटा मिलान में कुछ मूल्यों से कुछ।2 यूनिक्स फ़ाइलों और आउटपुट मिलान लाइनों की तुलना एक नई फ़ाइल में करें?

मैं इस डेटा को केवल मेल खाने वाले मूल्यों की एक नई फ़ाइल में कैसे पार्स करूं?

मुझे लगता है कि मैं नल पात्रों को न्यूलाइन में बदलने के लिए sed का उपयोग कर सकता हूं? वहां से मैं वास्तव में निश्चित नहीं हूं ...

कोई विचार?

+4

मूल्यों एक एकल फाइल के भीतर नकल कर रहे हैं? कुछ नमूना डेटा मदद मिलेगी। –

+1

कोई फर्क नहीं पड़ता है, या आप फ़ाइल में किसी भी बिंदु पर अस्तित्व के मिलान की तलाश कर रहे हैं? @JohnZwinck के रूप में, नमूना डेटा मदद मिलेगी। – Radix

+0

स्थिति कोई फर्क नहीं पड़ता, डुप्लिकेट मान हो सकते हैं। – rreeves

उत्तर

12

उपयोग tr, sort और comm:

नई लाइनों में कन्वर्ट nulls है, और परिणाम क्रमबद्ध करें:

$ tr '\000' '\n' < file1 | sort > file1.txt 
$ tr '\000' '\n' < file2 | sort > file2.txt 

तो comm का उपयोग लाइनों है कि दोनों फ़ाइल के लिए आम हैं पाने के लिए:

$ comm -1 -2 file1.txt file2.txt 
<lines shown here are the common lines between file1.txt and file2.txt> 
5

यदि फ़ाइल 1 या फ़ाइल 2 में कोई डुप्लिकेट मान नहीं है, तो आप यह कर सकते हैं:

(tr '\0' '\n' < file1; tr '\0' '\n' < file2) | sort | uniq -c | egrep -v '^ +1' 

यह दो फ़ाइलों के बीच सभी डुप्लिकेट मानों की गणना करेगा।

तो खेतों के क्रम महत्वपूर्ण है, तो आप ऐसा कर सकते हैं:

comm -1 -2 <(tr '\0' '\n' < file1) <(tr '\0' '\n' < file2) 

यह दृष्टिकोण पोर्टेबल नहीं है, यह बैश की 'प्रक्रिया प्रतिस्थापन' सुविधा की आवश्यकता है।

1

यह आप के लिए काम कर सकते हैं:

parallel 'tr "\000" "\n" <{} | sort -u' ::: file{1,2} | sort | uniq -d 
संबंधित मुद्दे