पहले खाली लाइन तक, एक निश्चित पाठ से शुरू होने वाला ग्रीप


9

मेरे पास एक फाइल prova.txtहै:

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

extra1
extra2
bla

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

extra2
bla
bla

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

और मुझे पहले रिक्त लाइन के लिए "यहां हड़पने के लिए शुरू करें" से बाहर निकलने की आवश्यकता है। आउटपुट इस तरह होना चाहिए:

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4

Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

जैसा कि आप देख सकते हैं कि "स्टार्ट टू ग्रैब" के बाद की लाइनें यादृच्छिक हैं, इसलिए -ए-ग्रिप फ्लैग काम नहीं करता है:

cat prova.txt | grep "Start to grab from here" -A 15 | grep -B 15 "^$" > output.txt

क्या आप एक रास्ता खोजने में मेरी मदद कर सकते हैं जो पहली पंक्ति को पकड़ लेगा जिसे पकड़ा जाएगा (जैसा कि "यहां से शुरू करना है"), एक खाली रेखा तक। मैं अनुमान नहीं लगा सकता कि "यहां से हड़पने की शुरुआत करें" के बाद मेरे पास कितनी यादृच्छिक रेखाएँ होंगी।

किसी भी यूनिक्स संगत समाधान की सराहना की जाती है (grep, sed, awk बेहतर है पर्ल या समान)।

आदर्श: @ john1024 द्वारा शानदार प्रतिक्रिया के बाद, मैं यह जानना चाहूंगा कि क्या यह संभव है:

1 ° ब्लॉक को क्रमबद्ध करें (यहाँ से शुरू करने के लिए अनुसार: 1 फिर 1 फिर 2)

2 ° निकालें 4 (वर्णानुक्रमिक रूप से यादृच्छिक) लाइनें fix1, fix2, fix3, fix4 लेकिन हमेशा 4 होती हैं

3 ° अंततः सॉर्ट-ड्यू कमांड की तरह रैंडम ड्यूप्स को हटाता है

अंतिम आउटपुट शूल इस तरह होना चाहिए:

# fix lines removed - match 1 first time
Start to grab from here: 1
random1
random2
random3
random4

#fix lines removed - match 1 second time
Start to grab from here: 1
#random1 removed cause is a dupe
random22131

#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561

या

# fix lines removed - match 1 first time and the second too
Start to grab from here: 1
random1
random2
random3
random4
#random1 removed cause is a dupe
random22131

#fix lines removed - match 2 that comes after 1
Start to grab from here: 2
random1546
random2561

दूसरा आउटपुट बेहतर है कि पहला वाला। कुछ अन्य यूनिक्स कमांड जादू की जरूरत है।


1
यह java jstack आउटपुट से किसी विशेष थ्रेड के लिए स्टैक ट्रेस को हथियाने के लिए वास्तव में मददगार है। खुशी है कि मुझे यह Q & A मिला!
बेंजामिन

जवाबों:


13

जाग का उपयोग करना

प्रयत्न:

$ awk '/Start to grab/,/^$/' prova.txt
Start to grab from here: 1
random1
random2
random3
random4

Start to grab from here: 2
random1546
random2561

Start to grab from here: 3
random45
random22131

/Start to grab/,/^$/एक सीमा को परिभाषित करता है। यह किसी भी रेखा से शुरू Start to grabहोता है जो पहले खाली रेखा से मेल खाता है और समाप्त होता है ^$, जो इस प्रकार है।

Sed का उपयोग करना

बहुत समान तर्क के साथ:

$ sed -n '/Start to grab/,/^$/p' prova.txt
Start to grab from here: 1
random1
random2
random3
random4

Start to grab from here: 2
random1546
random2561

Start to grab from here: 3
random45
random22131

-nजब तक हम स्पष्ट रूप से इसे नहीं पूछेंगे तब तक कुछ भी नहीं छापने के लिए sed को बताता है। /Start to grab/,/^$/pइसके द्वारा परिभाषित सीमा में किसी भी रेखा को मुद्रित करने के लिए कहता है /Start to grab/,/^$/


आपका समाधान एकदम सही है, मैंने कुछ जोड़ने के लिए अपनी पूछ को संपादित किया है। अपनी मदद के बारे में सचेत करें। धन्यवाद
हीसेन

1

मैं एक वैकल्पिक समाधान पोस्ट कर रहा हूं क्योंकि यह कुछ लोगों के उपयोग के मामलों के लिए उपयोगी हो सकता है। यह समाधान वास्तव में बताई गई आवश्यकताओं का पालन नहीं करता है, सबसे अच्छा समाधान के लिए @ John1024 से जवाब देखें।

आप एक अलग स्ट्रिंग के लिए रिकॉर्ड सेपरेटर के साथ awk का उपयोग कर सकते हैं, awk इनकी व्याख्या नई रिक्तियों के रूप में करेगा:

$ awk '/Start/' RS= prova.txt 
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random2
random3
random4
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561
Start to grab from here: 1
fix1
fix2
fix3
fix4
random1
random22131

यह संस्करण आउटपुट में रिक्त न्यूलाइन्स को संरक्षित नहीं करता है। अगर मौजूद है तो मैच से पहले उसका संदर्भ भी दिखाएगा। यह व्यवहार बहुत उपयोगी हो सकता है जब किसी फ़ाइल में किसी चीज़ के लिए grepping हो और आप न्यूलाइन सीमांकित ब्लॉक को देखना चाहते हैं, उदाहरण के लिए:

$ awk '/random1546/' RS= prova.txt 
Start to grab from here: 2
fix1
fix2
fix3
fix4
random1546
random2561

उदाहरण के लिए, मुझे यह उपयोगी लगता है जब iniफ़ाइलों में चीजों के लिए grepping ।

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