2013-04-02 10 views
11

के बीच खींचें लाइनें मुझे कुछ बड़ी सीएसवी फाइलें मिली हैं, जहां मैं लाइन एक्स के बीच सभी डेटा निकालना चाहता हूं जिसमें पैटर्न 'एक्स' और लाइन वाई शामिल है जिसमें पैटर्न 'y'सेड/एवीके - पैटर्न एक्स और वाई

शामिल है

उदाहरण के लिए:

other_data 
Header 
data 
data 
data 
Footer 
other_data 

मैं के बीच पाइप सब कुछ करने में सक्षम है (और सहित) होना चाहता हूँ हैडर -> एक नई फ़ाइल में पाद।

धन्यवाद!

उत्तर

16

का उपयोग awk यह बहुत सीधा है:

awk '/Header/ { show=1 } show; /Footer/ { show=0 }' 

मूल रूप से show नामक एक चर में राज्य रहते हैं। जब हम हेडर को दबाते हैं तो हम इसे चालू करते हैं, पाद लेख हम इसे बंद कर देते हैं। हालांकि यह चालू है, show नियम रिकॉर्ड प्रिंट करने की डिफ़ॉल्ट कार्रवाई निष्पादित करता है।

+0

कि पूरी तरह से काम करता है, स्पष्टीकरण के लिए धन्यवाद! – Numpty

+3

+1 क्योंकि यह सही उत्तर है क्योंकि यह उन स्थितियों को कवर करने के लिए आसानी से बढ़ाया जाता है जहां आप पहली पंक्ति या अंतिम पंक्ति या दोनों पंक्तियां या अन्य कुछ भी प्रिंट करना चाहते हैं, जिन्हें आप करना चाहते हैं। थोड़ी सी आवश्यकताओं को बदलने के लिए/स्टार्ट /,/एंड/श्रेणियों का उपयोग करने वाले समाधान थोड़ी सी आवश्यकताएं बदलते हैं - यह पैटर्न मामूली समस्याओं के समाधान को थोड़ा सा हल करता है लेकिन गैर-तुच्छ समस्याओं के समाधान बहुत लंबा और जटिल होता है या फिर से लिखने की आवश्यकता होती है ये शैली। –

14

यह बिल्कुल स्पष्ट है sed:

sed -n '/Header/,/Footer/p' 

या

sed '/Header/,/Footer/!d' 
+0

बस एडब्ल्यूके के साथ काम करता है, धन्यवाद। मैं पहले यहां पहुंचने के बाद से घातक को स्वीकार कर दूंगा, लेकिन इसके लिए धन्यवाद। यहां एक +1 – Numpty

+1

है, मुझे अजीब समाधान के रूप में 1/4 समय लेने के लिए पहला विकल्प ('/ p' समापन) मिला। दूसरा विकल्प ('/! D') ने उतना ही समय लिया जितना अजीब। एक बड़ी फाइल में, इससे कोई फर्क नहीं पड़ता। – RaveTheTadpole

+0

यह भी काम करता है जब डेलीमीटर एक जैसा होता है। 'Awk' संस्करण केवल तभी काम करता है जब वे अलग होते हैं। – akostadinov

9

एक और तरीका है awk साथ:

awk '/Header/,/Footer/' file 
Header 
data 
data 
data 
Footer 

बस एक newfile में बचाने के लिए उत्पादन अनुप्रेषित:

awk '/Header/,/Footer/' file > newfile 
+1

आपका सबसे सुंदर है, इसलिए आपको एक बिंदु मिलता है :) – Numpty

+0

हाँ, यह सबसे अच्छा लगता है। +1। – Beta

+0

मैं उत्सुक हूं: क्या इस तरह के पैटर्न का उपयोग कर "हेडर से फ़ाइल के अंत तक" है? (शीर्ष अजीब समाधान का उपयोग करना बहुत आसान है, लेकिन यह सोच रहा है कि "/ फूटर /" के बजाय "फ़ाइल का अंत" मार्कर है या नहीं) –

1

यह आप के लिए काम कर सकते हैं (जीएनयू sed):

sed '/^Header/,/^Footer/w new_file' file 
+0

यह काम करता है, लेकिन पूरी मूल फ़ाइल को stdout पर रीडायरेक्ट करता है। यह पाइप के साथ उपयोग करना मुश्किल बनाता है। – Sparhawk

संबंधित मुद्दे