2012-05-19 12 views
7

मेरे पास एक फ़ाइल है जिसमें कुछ शब्द हैं जो ब्रांड्स में हैं। मैं वहां दिखाए जाने अनूठा शब्द के सभी की एक सूची संकलित करने के लिए करना चाहते हैं, उदाहरण के लिए:ब्रांड्स के बीच दिखाई देने वाले सभी शब्द कैसे खोजें?

This is some (text). 
This (text) has some (words) in parenthesis. 
Sometimes, there are numbers, such as (123) in parenthesis too. 

इस जिसके परिणामस्वरूप सूची होगा:

text 
words 
123 

मैं के बीच दिखाई दे रहा आइटम के सभी कैसे सूचीबद्ध कर सकते हैं कोष्ठक?

उत्तर

17

आप इस तरह awk उपयोग कर सकते हैं:

awk -F "[()]" '{ for (i=2; i<NF; i+=2) print $i }' file.txt

प्रिंट:

text 
text 
words 
123 

आप अनन्य मानों मुद्रित करने के लिए एक सरणी का उपयोग कर सकते हैं:

awk -F "[()]" '{ for (i=2; i<NF; i+=2) array[$1]=$i; print array[$1] }' file.txt

प्रिंट:

text 
words 
123 

HTH

+0

इस तरह यह सुरुचिपूर्ण है। असंतुलित कोष्ठक असफल हो जाएगा, हालांकि, वास्तव में यह केवल संश्लेषण के रूप में संश्लेषण के रूप में उपयोग कर रहा है। '"1) देखें कि क्या (यह) (शब्द) पकड़ा गया है" प्रिंट' देखें ' –

3

grep -oE '\([[:alnum:]]*?\)' | sed 's/[()]//g' | sort | uniq

  • -o केवल मिलान पाठ
  • -E साधन विस्तारित रेगुलर एक्सप्रेशन का उपयोग
  • \( साधन एक शाब्दिक कोष्ठक
  • [[:alnum:]] अक्षर और अंक के लिए POSIX चरित्र वर्ग है से मेल प्रिंट करता है।

sed स्क्रिप्ट को माता-पिता को बाहर निकालना चाहिए। यह जीएनयू grep के खिलाफ परीक्षण किया जाता है, लेकिन बीएसडी sed इतना सावधान रहना।

+0

मुझे अपने sed आदेश के अंत में वैश्विक 'g' ध्वज संलग्न करने की आवश्यकता है, लेकिन अन्यथा यह काम करता है। – chrisaycock

+0

यही टाइपिंग के लिए मिलता है और कॉपी नहीं करता है! – mkb

2

अपनी सूची पुन: पेश करने के लिए:

cat file.txt | sed 's/.*(\(.*\)).*/\1/' 

अद्वितीय शब्दों की एक सूची संकलन करने के लिए, आप आगे सूची संसाधित करने की जरूरत:

cat file.txt | sed 's/.*(\(.*\)).*/\1/' | sort | uniq 
+2

यह एक वाक्य पर काम नहीं करेगा जिसमें एक से अधिक (शब्द) 'है। sed केवल एक मैच मिलेगा। – chrisaycock

+0

क्या आप इसे सही कर सकते हैं, क्योंकि यह @chrisaycock –

+0

@VenkatMadhav द्वारा सुझाए गए वाक्य पर काम नहीं करेगा स्टीव काम से स्वीकृत उत्तर ठीक है। –

5
जीएनयू ग्रेप साथ

, आप एक पर्ल का उपयोग कर सकते माता-पिता को बाहर करने के लिए आसपास के दावे के साथ असंगत regex:

grep -Po '(?<=\().*?(?=\))' file.txt | sort -u 
+0

+1 मुझे पता था कि यह एक अच्छा grep के साथ किया जा सकता है। स्थिरता – Steve

+1

@steve के लिए सॉर्ट और यूनिक पाइप जोड़ा गया, मैं आपका 'सॉर्ट | uniq' देखता हूं और आपको' sort -u' –

1

आप इस

sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename|awk -F'(' '{print $2}'|sort -u 

Explaination कोशिश कर सकते हैं:

1 sed बयान देता है कोष्ठक में शब्द नई लाइन में और दूसरा एसईडी नई लाइन के साथ चरित्र ')' बदल देता है।तो नीचे दिए गए बयान

sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename 

चलाने के बाद उत्पादन इस

This is some 
(text 
.This 
(text 
has some 
(words 
in parenthesis. 
Sometimes, there are numbers, such as 
(123 
in parenthesis too. 

कैसा दिखेगा अब awk बयान जो फिल्टर चरित्र के बीच दूसरा शब्द प्रिंट नीचे करने के लिए इस उत्पादन पाइप '('

awk -F'(' '{print $2}' 

आउटपुट अब

text 
text 
words 
123 

उपर्युक्त आउटपुट से अद्वितीय शब्दों को देने के लिए उपरोक्त आउटपुट को क्रमबद्ध करने के लिए पाइप किया गया है। आशा है कि यह स्पष्टीकरण मदद करता है।

+0

उठाता हूं, कृपया अपने उत्तर को थोड़ा सा समझाएं ... –

+0

@AK_ ने स्पष्टीकरण के साथ अपना उत्तर संपादित किया। उम्मीद है कि अगर आप संतुष्ट हैं तो उत्तर में मदद और उत्तर वोट दें। –

+0

+1 अब यह एक अच्छी तरह से लिखित उत्तर है। –

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