2012-11-07 11 views
5

दो अलग-अलग पाठ फ़ाइलों पर आंतरिक शामिल होना चाहते हैं। असल में मैं जीएनयू शामिल कार्यक्रम के बराबर आंतरिक शामिल होने की तलाश में हूं। क्या ऐसी किसी वस्तु का अस्तित्व है? यदि नहीं, तो awk या sed समाधान सबसे उपयोगी होगा, लेकिन मेरी पहली पसंद लिनक्स कमांड होगी।आंतरिक पाठ दो पाठ फ़ाइलों पर शामिल हों

0|Alien Registration Card LUA|Checklist Update 
1|Alien Registration Card LUA|Document App Plan 
2|Alien Registration Card LUA|SA Application Nbr 
3|Alien Registration Card LUA|tmp_preapp-DOB 
0|App - CSCE Certificate LUA|Admit Type 
1|App - CSCE Certificate LUA|Alias 1 
2|App - CSCE Certificate LUA|Alias 2 
3|App - CSCE Certificate LUA|Alias 3 
4|App - CSCE Certificate LUA|Alias 4 

फ़ाइल 2:

Alien Registration Card LUA 

परिणाम:

यहाँ है कि मैं क्या

फ़ाइल करने के लिए 1 देख रहा हूँ का एक उदाहरण है

0|Alien Registration Card LUA|Checklist Update 
1|Alien Registration Card LUA|Document App Plan 
2|Alien Registration Card LUA|SA Application Nbr 
3|Alien Registration Card LUA|tmp_preapp-DOB 

उत्तर

5

नहीं करना चाहिए फ़ाइल 2 मेंहै अंत में?

यदि हाँ, तो आप अभी भी join उपयोग कर सकते हैं:

join -t'|' -12 <(sort -t'|' -k2 file1) file2 
+0

धन्यवाद की जरूरत है! हां यह होना चाहिए (मैंने सवाल अपडेट किया है)। मुझे नहीं पता था कि कोई भी बाहर निकल सकता है और उस परिणाम को stdin के माध्यम से वापस खिला सकता है। बहुत उपयोगी! –

+0

@DaveSnigier: आप हमेशा एक temp फ़ाइल बना सकते हैं, लेकिन प्रक्रिया प्रतिस्थापन टाइप करने के लिए बहुत छोटा है। – choroba

0

आप फ़ाइल गठबंधन करने के लिए पेस्ट आदेश का उपयोग कर सकते हैं: अपने उदाहरण के लिए

paste [option] source files [>destination file] 

यह होगा

paste file1.txt file2.txt >result.txt 
+0

बंद करें, लेकिन पेस्ट केवल दो फाइलों की लाइन संख्याओं पर शामिल होगा।मैं वास्तव में इसके बजाय फ़ाइल में एक फ़ील्ड में शामिल होने के लिए देख रहा हूँ। –

5

आप इस स्क्रिप्ट को संशोधित कर सकता है:

cat file2 | while read line; do 
    grep $line file1 # or whatever you want to do with the $line variable 
done 

जबकि लूप लाइन 2 लाइन को लाइन से पढ़ता है और उस लाइन को grep कमांड को देता है जो फ़ाइल 1 में उस रेखा को पकड़ता है। कुछ अतिरिक्त आउटपुट हैं जो शायद grep विकल्पों के साथ हटा दिए गए हैं।

+0

बहुत चालाक! मैं इस पैटर्न के लिए इस तत्काल समस्या से परे कई प्रयोगों को पा सकूंगा –

+2

'$ line' उद्धृत करना न भूलें। यदि इसमें रिक्त स्थान हैं, तो इसे बुरी तरह विस्तारित किया जा सकता है। साथ ही, यदि आप नियमित अभिव्यक्तियों के बजाय निश्चित स्ट्रिंग मिलान की तलाश में हैं (याद रखें, यह gREp है), तो '-F' विकल्प का उपयोग करें। – ghoti

+2

यह @glenjackman द्वारा [इस एवर] (http://stackoverflow.com/a/13278763/874188) का एक अक्षम पैराफ्रेश है। (हाँ, उसे बाद में पोस्ट किया गया था।) एक सिंगल 'grep' जो पैटर्न में पढ़ता है और उसके बाद लक्ष्य फ़ाइल को जांचता है, केवल एक बार प्रत्येक पैटर्न के लिए एक' grep' चलाने से काफी अधिक कुशल होता है, खासतौर पर बड़े इनपुट के लिए। – tripleee

5

यहाँ एक awk विकल्प है, ताकि आप बैश निर्भरता (पोर्टेबिलिटी के लिए) से बच सकते हैं:

$ awk -F'|' 'NR==FNR{check[$0];next} $2 in check' file2 file1 

कैसे काम करता है?

  • -F'|' - क्षेत्र विभाजक सेट
  • 'NR==FNR{check[$0];next} - कुल रिकार्ड संख्या फ़ाइल रिकार्ड संख्या (अर्थात हम प्रदान की पहली फ़ाइल पढ़ रहे हैं) से मेल खाती है, तो हम एक सरणी पॉप्युलेट और जारी रखें।
  • $2 in check - यदि हमारे द्वारा बनाए गए सरणी में दूसरे फ़ील्ड का उल्लेख किया गया था, तो रेखा मुद्रित करें (यदि कोई क्रिया प्रदान नहीं की जाती है तो डिफ़ॉल्ट कार्रवाई होती है)।
  • file2 file1 - फ़ाइलें। NR==FNR निर्माण के कारण आदेश महत्वपूर्ण है।
4

ऐसा लगता है कि तुम सिर्फ

grep -F -f file2 file1 
संबंधित मुद्दे