2013-02-20 34 views
45

बहुत से लोग एक साथ कई इनपुट फ़ाइलों AWK'ing के लिए निम्नलिखित समाधान पोस्ट करके बहुत मददगार रहे हैं:एकाधिक फ़ाइलें से इनपुट को संसाधित करने AWK का उपयोग

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 

यह अच्छी तरह से काम करता है, लेकिन मैं सोच रहा था अगर मैं किसी को मुझे समझा सकता है क्यों? मुझे एडब्ल्यूके वाक्यविन्यास लटका पाने के लिए थोड़ा मुश्किल लगता है और उम्मीद कर रहा था कि कोई मेरे लिए कोड स्निपेट को तोड़ने में कोई फर्क नहीं पड़ेगा।

उत्तर

50
awk 'FNR==NR{a[$1]=$2 FS $3;next} 

यहां हम पहले इनपुट (फ़ाइल 2) को संभालते हैं। कहें, एफएस अंतरिक्ष है, हम एक सरणी (a) बनाते हैं, इंडेक्स कॉलम 1 है, मान column2 " " column3FNR==NR and next का मतलब है, कोड का यह हिस्सा केवल फ़ाइल 2 के लिए काम करता है। आप जाँच gawk एनआर और एफ एन आर

{ print $0, a[$1]}' file2 file1 

हैं क्या आदमी सकता है जब NR != FNR यह 2 इनपुट, file1 कार्रवाई करने के लिए समय है। यहां हम फ़ाइल 1 की रेखा मुद्रित करते हैं, और सूचकांक के रूप में कॉलम 1 लेते हैं, सरणी (ए) प्रिंट में मान का पता लगाएं। एक और शब्द में, फ़ाइल 1 और फ़ाइल 2 दोनों फाइलों में कॉलम 1 द्वारा शामिल हो गए हैं।

एनआर और एफ एन आर, कुछ ही समय के लिए

,

1st input has 5 lines 
2nd input has 10 lines, 

NR would be 1,2,3...15 
FNR would be 1...5 then 1...10 

आप FNR==NR जांच की चाल को देखते हैं।

+0

केंट, उत्कृष्ट स्पष्टीकरण; आपका बहुत बहुत धन्यवाद। मुझे एहसास नहीं हुआ कि 'एफएनआर == एनआर' एक प्रकार का 'if' कथन बना रहा था। यह वही है जो मुझे आगे बढ़ने में सक्षम होने की आवश्यकता है। मदद करने के लिए समय लेने के लिए बहुत बहुत धन्यवाद! – jkovba

8

मुझे Google पर यह प्रश्न/उत्तर मिला और ऐसा लगता है कि यह किसी अन्य प्रश्न (How to merge two files using AWK?) में पाए गए एक बहुत ही विशिष्ट डेटा सेट का जिक्र कर रहा है। मैं जो जवाब ढूंढ रहा था वह है (और मुझे लगता है कि ज्यादातर लोग होंगे), यानी, एडब्ल्यूके का उपयोग करके दो अलग-अलग फाइलों से प्रत्येक पंक्ति को जोड़ना। हालांकि आप शायद कुछ यूनिक्स उपयोगिताओं तरह या पेस्ट में शामिल होने के इस्तेमाल कर सकते हैं, AWK स्पष्ट रूप से और अधिक लचीला और शक्तिशाली है कि आपका इच्छित उत्पादन अलग है, अगर बयानों का उपयोग कर, या फेरबदल ओएफएस (अधिक हो सकता है जिसके द्वारा मुश्किल उपयोगिता के आधार पर करने के लिए, सरल पंक्ति-दर-पंक्ति संयोजन के लिए उदाहरण के लिए नीचे देखें), एक और अधिक अर्थपूर्ण तरीके से निर्गम (खोल scripters लिए एक महत्वपूर्ण विचार फेरबदल)

:

awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""], $0 }' file1 file2

यह अंतर्निहित प्रकार रूपांतरण का उपयोग करके संख्यात्मक रूप से अनुक्रमित सरणी (एडब्ल्यूके में केवल सहयोगी सरणी) के कार्य को अनुकरण करता है। यह अपेक्षाकृत अभिव्यक्तिपूर्ण और समझने में आसान है।

test1 और निम्नलिखित लाइनों के साथ test2 कहा जाता है दो फ़ाइलों का उपयोग करना:

test1:

line one 
line two 
line three 

test2:

line one line four 
line two line five 
line three line six 

:

line four 
line five 
line six 

मैं इस परिणाम मिलता है हो पर निर्भर करता है w आप आउटपुट में कॉलम के बीच मानों में शामिल होना चाहते हैं, तो आप उचित आउटपुट फ़ील्ड सेपरेटर चुन सकते हैं। इलिप्स के साथ एक उदाहरण यहां है (...) स्तंभों को अलग:

awk 'BEGIN { OFS="..."} FNR==NR { a[(FNR"")] = $0; next } { print a[(FNR"")], $0 }' test1 test2

इस परिणाम पैदावार:

line one...line four 
line two...line five 
line three...line six 

मैं कम से कम उम्मीद है कि इस आप सभी AWK की शक्ति का लाभ लेने के लिए प्रेरित करती है!

+4

यदि लक्ष्य सिर्फ कॉलम पक्ष में शामिल होने के लिए है, तो 'paste' कमांड का उपयोग करना बहुत आसान है। – biocyberman