कैसे grep या ack में एक प्रशिक्षण से एक आंशिक या एक नंबर उत्पादन करने के लिए


2

मेरे पास एक टेक्स्ट फाइल है demo.txt नीचे की तरह।

This is a line with id (9)
This (8) is another line with id
(10) This is a line with id too
11 This line does nothing

फ़ाइल में अनियमित रूप से आईडी बिखरी हुई कुछ लाइनें हैं। आईडी पैटर्न कोष्ठक के साथ संख्या है।

मेरा काम इस फाइल में सबसे बड़ी आईडी ढूंढना है ताकि मुझे पता चले कि नई लाइन जोड़ते समय अगली आईडी क्या है।

मेरा पिछला काम

ack-grep demo.txt -o --match '\(\d+\)' | sort -r | head -n 1

परिणाम है (9) लेकिन नहीं (10) मेरी अपेक्षा के रूप में। मुझे लगता है कि इसका कारण है sort आउटपुट को पाठ के रूप में मानता है क्योंकि उनके पास कोष्ठक है।

सवाल यह है: मैं केवल नंबर से आउटपुट कैसे कर सकता हूं ack या grep बाद में छँटाई लेकिन फिर भी पैटर्न का मिलान करना (मेरे उदाहरण में कोष्ठक)?

आपका बहुत बहुत धन्यवाद!


हम्म, के साथ परीक्षण करने के लिए मेरे सिस्टम पर कोई 'ऐक' नहीं। क्या यह यह कार्यक्रम है? betterthangrep.com/install
Hennes

@ हाँ, हाँ, यह उस कार्यक्रम है। और उबंटू में नाम है act-grep। एक पैकेज है apt-get install ack-grep। मैंने खुद पाया act से अधिक स्थिर grep
Billy Chan

@ बिलिचन: आपका मतलब है ack-grep तथा ack, नहीं act-grep तथा act। और आपका क्या मतलब है कि grep की तुलना में ack अधिक स्थिर है? मैं ack का लेखक हूं और मैं निश्चित रूप से ऐसा दावा नहीं करूंगा।
Andy Lester

@AndyLester, आपके अच्छे काम के लिए धन्यवाद ack। मैंनें इस्तेमाल किया grep पहले, लेकिन कभी-कभी अजीब त्रुटियां हुईं, फिर मैंने स्विच किया ack और ऐसी त्रुटियां गायब हो गईं। इसलिए मैंने अपने नोटों पर इस तरह के दावे को जोड़ा लेकिन वास्तव में त्रुटियों के लिए मामलों को याद नहीं कर सका।
Billy Chan

ack और grep अलग तरह से व्यवहार करते हैं। एक के लिए, बाइनरी बाइनरी फ़ाइलों में नहीं दिखेगी जब तक कि आप इसे विशेष रूप से नहीं पूछते हैं, इसलिए हो सकता है कि आपको जो त्रुटियां मिल रही थीं, वे बाइनरी डेटा की खोज के बारे में चेतावनी दे रहे थे।
Andy Lester

जवाबों:


4

grep एक मैच के भागों का उत्पादन करने के लिए इस्तेमाल नहीं किया जा सकता है, लेकिन कोष्ठक से छुटकारा क्यों नहीं?

यह जीएनयू के लिए काम करता है grep:

grep -P '\(\d+\)' -o demo.txt | sed 's/[()]//g' | sort -nr | head -n1

निम्नलिखित बीएसडी के लिए भी काम करते हैं grep, जो आप ओएस एक्स पर उपयोग कर सकते हैं, उदाहरण के लिए:

grep -E '\([[:digit:]]+\)' -o demo.txt | …    
grep -E '\([0-9]+\)' -o demo.txt | …

हम चाहते हैं कि परिणाम प्राप्त करने के लिए, हम जोड़ते हैं -n करने के लिए तर्क sort संख्यात्मक रूप से क्रमबद्ध करने के लिए, जो आपको देता है 10 पहले परिणाम के रूप में।


1
पूर्णता के लिए (हालाँकि मैं अतिरिक्त स्थापित पर्ल स्क्रिप्ट पर डिफ़ॉल्ट रूप से स्थापित संकुल पसंद करता हूँ): ./ack-grep demo.txt -o --match '\(\d+\)' | sed 's/[()]//g' | sort -nr | head -n 1 (Slhk के सॉर्ट और सेड का उपयोग करके)।
Hennes

हां, मुझे लगा कि मैं डिफ़ॉल्ट का उपयोग करूंगा grep चूंकि हर कोई नहीं हो सकता है ack-grep, लेकिन पहला आदेश आसानी से बदला जा सकता है।
slhck

slhck, उत्तर पूरी तरह से काम करता है। Sed कमांड इतनी स्मार्ट है। आपका बहुत बहुत धन्यवाद! @ धन्यवाद, आपका भी धन्यवाद!
Billy Chan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.